站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题求教一个正则表达式的超级难题,再搞不定就要被炒鱿鱼络

求教一个正则表达式的超级难题,再搞不定就要被炒鱿鱼络

摘要: 求教一个正则表达式的超级难题,再搞不定就要被炒鱿鱼络


如下
有字符串如
str=<head> 333 < 444</head>

4 < 6

55 < 66



现要求匹配每个标签,如果标签后有内容,需把内容一起匹配
就是说要求结果匹配结果分组如下
1:
2:<head>
3: 333<444<br/>4:
5:</head>
6:

4 <6
........
我只能做到下面这步,但这样就匹配不到“<”号以及后面的字符了
Matcher m =
Pattern.compile("()[^<]*|()|()").matcher(str);

请高人不吝指教啊!!!!!!!!!!


连 < 也要匹配??


是啊,难就难在又要匹配内容中的 "<" 但又不能匹配标签的“<”


根据>找<,就怕会出现多余的>


这个有什么特别的吗?



那就别用正则表达式算了。。


别用正则表达式,那怎么弄,请问



没有汽车,难度就不能出门了?
正则表达式不好用,就自己写代码呗


在什么应用中会有这样的字符串,小于号肯定需要转换


()//s*//d+[^<]//d+|()|()


空白符没补全

()//s*//d+//s*[^<]//s*//d+//s*|()|()


可不可以利用jdom来解析?


为什么一定要用正则表达式?我觉得这种情况不适合正则表达式。
建议楼主用其他方法解决,比如说压栈判断。


需求再说一下阿,没有看懂,先给点建议

部分,建议改为"<(//w+)>",其中/1代表group(1)的内容,也就是第一个/w+

对于不需要group,但是又要写括号的,用(?:xxxx)代替(xxxx)


package test;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

private static String regex = "<(//w+)>(.*)|<(//w+)/>";

private static Pattern pattern = Pattern.compile(regex);

public static void main(String[] args) {

String test = "<head> 333 < 444</head>

4 < 6

55 < 66


";

List list = foo(test);
for (int i = 0; i < list.size(); i++) {
String element = (String) list.get(i);
System.out.println((i + 1) + ": " + element);
}
}

public static List foo(String element) {
Matcher m = pattern.matcher(element);

List list = new ArrayList();
while (m.find()) {
if (m.group().endsWith("/>")) {
list.add(m.group());
} else {
String subelement = m.group(2);
List sublist = foo(subelement);
if (sublist.isEmpty()) {
list.add("<" + m.group(1) + ">" + m.group(2));
} else {
list.add("<" + m.group(1) + ">");
}
list.addAll(sublist);
list.add("");
}
}
return list;
}
}



输出:

1:
2: <head>
3: 333 < 444<br/>4:
5: </head>
6:

4 < 6
7:


8:

55 < 66
9:


10:

11:



太谢谢了啊
shine333


↑返回目录
前一篇: [新手问题] 关于与类名同名的方法
后一篇: 请问如何在java的菜单项上添加图标~~!!