又见正则--HTML

xiaoran139 2008-10-20 01:02:42
字符串:
<li id='li-1'><li id='li-2'><li id='li-3'>aaaa</li></li></li>

结果:
<li id='li-1'><li id='li-2'><li id='li-3'>aaaa</li></li></li>
<li id='li-2'><li id='li-3'>aaaa</li></li>
<li id='li-3'>aaaa</li>

标签 是任意标签 这里只是举个例子~~~
...全文
238 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoran139 2008-10-21
  • 打赏
  • 举报
回复
有更简单的代码吗?

没有我就 结贴了。
java__king 2008-10-20
  • 打赏
  • 举报
回复
强大.
qiandongbo 2008-10-20
  • 打赏
  • 举报
回复
哥们,我已经入黑名单了~=.=!
不然谁去听那无聊的课~
sunyujia 2008-10-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qiandongbo 的回复:]
Java code
package Test;
import java.util.regex.*;
public class qdb
{
private int count=0;
public void f(String input)
{
String regex1="<[^/<].*?>\\s*";
Pattern p1=Pattern.compile(regex1);
Matcher m1=p1.matcher(input);
while(m1.find())
{
count++;
}
for(int i=0;i<=count;i++)
{
Stri…
[/Quote]
我的大学,逃课是必然的,上课是偶然的。
qiandongbo 2008-10-20
  • 打赏
  • 举报
回复
刚才走的太急了,改善下

package Test;
import java.util.regex.*;
public class qdb
{
private int count=0;
public void f(String input)
{
String regex1="<[^/<].*?>\\s*";//用于匹配任何属性<a> <div> <p>等
Pattern p1=Pattern.compile(regex1);
Matcher m1=p1.matcher(input);
while(m1.find())
{
count++;//查找前端属性总个数.
}
for(int i=1;i<=count;i++)//根据count来循环输出属性
{
String regex2="(<[^/<]*?>){"+i+"}([^<>]*)(</.*?>){1,"+i+"}";
Pattern p2=Pattern.compile(regex2);
Matcher m2=p2.matcher(input);
while(m2.find())
{
System.out.println(m2.group());
}
}
}
public static void main(String[] argus)
{
String input="<li id='li-1'><li id='li-2'><li id='li-3'>aaaa</li></li></li>";
qdb q=new qdb();
q.f(input);
System.out.println("--------");
String input1="<br><li id='li-1'><li id='li-2'><li id='li-3'>aaaa</li></li></li>";
q.f(input1);
System.out.println("--------");
String input2="<p><br><li id='li-1'><li id='li-2'><li id='li-3'>aaaa</li></li></li>";
q.f(input2);
}
}
[/java]
下面为几次test的输出
[code=Java]
<li id='li-3'>aaaa</li>
<li id='li-2'><li id='li-3'>aaaa</li></li>
<li id='li-1'><li id='li-2'><li id='li-3'>aaaa</li></li></li>
--------
<li id='li-3'>aaaa</li>
<li id='li-2'><li id='li-3'>aaaa</li></li>
<li id='li-1'><li id='li-2'><li id='li-3'>aaaa</li></li></li>
<br><li id='li-1'><li id='li-2'><li id='li-3'>aaaa</li></li></li>
--------
<li id='li-3'>aaaa</li>
<li id='li-2'><li id='li-3'>aaaa</li></li>
<li id='li-1'><li id='li-2'><li id='li-3'>aaaa</li></li></li>
<br><li id='li-1'><li id='li-2'><li id='li-3'>aaaa</li></li></li>
<p><br><li id='li-1'><li id='li-2'><li id='li-3'>aaaa</li></li></li>
sagezk 2008-10-20
  • 打赏
  • 举报
回复
11楼 代码运行结果:
* <li id='li-1'>
<li id='li-2'> <li id='li-3'>aaaa </li>
</li> </li>
* <li id='li-2'> <li id='li-3'>aaaa </li>
</li>
* <li id='li-3'>aaaa </li>
xiaoran139 2008-10-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 qiandongbo 的回复:]
Java code
package Test;
import java.util.regex.*;
public class qdb
{
private int count=0;
public void f(String input)
{
String regex1="<[^/<].*?>\\s*";
Pattern p1=Pattern.compile(regex1);
Matcher m1=p1.matcher(input);
while(m1.find())
{
count++;
}
for(int i=0;i<=count;i++)
{
Stri…
[/Quote]

不行 这个值都是虚拟的假设存在的值 不能写成死的
String regex2="(<[^/<]*?>){"+i+"}(aaaa)(</.*?>){"+i+"}";
这就不对了。
xiaoran139 2008-10-20
  • 打赏
  • 举报
回复
好的。下大力气了。
qiandongbo 2008-10-20
  • 打赏
  • 举报
回复

package Test;
import java.util.regex.*;
public class qdb
{
private int count=0;
public void f(String input)
{
String regex1="<[^/<].*?>\\s*";
Pattern p1=Pattern.compile(regex1);
Matcher m1=p1.matcher(input);
while(m1.find())
{
count++;
}
for(int i=0;i<=count;i++)
{
String regex2="(<[^/<]*?>){"+i+"}(aaaa)(</.*?>){"+i+"}";
Pattern p2=Pattern.compile(regex2);
Matcher m2=p2.matcher(input);
while(m2.find())
{
System.out.println(m2.group());
}
}
}
public static void main(String[] argus)
{
String input="<li id='li-1'><li id='li-2'><li id='li-3'>aaaa</li></li></li>";
String regex="(<[^/].*?>\\s*)";
qdb q=new qdb();
q.f(input);
}
}


逃课回来写的,有BUG告诉我下
sagezk 2008-10-20
  • 打赏
  • 举报
回复
import java.util.List;
import java.util.LinkedList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class OnionRegex {

public static final Pattern P = Pattern.compile("(?is)\\s*<([a-z0-9-]+)(?:\\s+[^<>]*)?>(.*)</\\1>\\s*");

public static void onionFind(String s, List<String> result) {
if (s == null || result == null) throw new NullPointerException();
Matcher m = null;
if ((m = P.matcher(s)).matches()) {
result.add(s.trim());
onionFind(m.group(2), result);
}
}

public static void main(String[] args) {
String t = "<li id='li-1'>\n <li id='li-2'>\t <li id='li-3'>aaaa </li>\t\n </li> </li>";
List<String> r = new LinkedList<String>();
onionFind(t, r);
for (String s : r) {
System.out.println("* " + s);
}
}

}
sunyujia 2008-10-20
  • 打赏
  • 举报
回复
据我以前的经验我写的正则一般都有点bug,楼主多准备些数据测试,正则里面的一些界定容易引起bug,
希望火龙果,能给个不需要递归就就能搞定的正则,期待啊。
sunyujia 2008-10-20
  • 打赏
  • 举报
回复
public class TestA {
public static void find(String s) {
Pattern p = Pattern.compile("(<li .+?>(.*)</li>)");
Matcher matcher = p.matcher(s);
if (matcher.find()) {
System.out.println(matcher.group(0));
find(matcher.group(2));
}
}

public static void main(String[] args) {
String test = "<li id='li-1'> <li id='li-2'> <li id='li-3'>aaaa </li> </li> </li>";
find(test);
}
}
qiandongbo 2008-10-20
  • 打赏
  • 举报
回复
没时间写了,得上课,一会回来再说吧
xiaoran139 2008-10-20
  • 打赏
  • 举报
回复
5 楼的意思 就是我要的结果。
xiaoran139 2008-10-20
  • 打赏
  • 举报
回复
汗~ ~~~

标签 是 假设的。

可能是div 可能是其他
sunyujia 2008-10-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 qiandongbo 的回复:]
Java code
package Test;
import java.util.regex.*;
public class qdb
{
public static void f(String input,String regex)
{
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(input);
while(m.find())
{
for(int i=1;i<=m.groupCount();i++)
{
System.out.println(m.group(i));
}
}
}

[/Quote]
楼主要的是无限li递归,以及标签内属性不限制,不是写死查找。
qiandongbo 2008-10-20
  • 打赏
  • 举报
回复

package Test;
import java.util.regex.*;
public class qdb
{
public static void f(String input,String regex)
{
Pattern p=Pattern.compile(regex);
Matcher m=p.matcher(input);
while(m.find())
{
for(int i=1;i<=m.groupCount();i++)
{
System.out.println(m.group(i));
}
}
}
public static void main(String[] args)
{
String input="<li id='li-1'><li id='li-2'><li id='li-3'>aaaa</li></li></li>";
String regex="(<li id='li-1'>(<li id='li-2'>(<li id='li-3'>aaaa</li>)</li>)</li>)";
f(input,regex);
}
}

简单写下,得上课了~下午开班会
xiaoran139 2008-10-20
  • 打赏
  • 举报
回复
1 楼的 用java代码实现一下。
sunyujia 2008-10-20
  • 打赏
  • 举报
回复
没写出来,关注,等火龙果。
qiandongbo 2008-10-20
  • 打赏
  • 举报
回复
用捕获组就行了,然后根据相应的组获取相应的字符串

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧