当前页面: 开发资料首页 → J2SE 专题 → 求教一个正则表达式的超级难题,再搞不定就要被炒鱿鱼络
求教一个正则表达式的超级难题,再搞不定就要被炒鱿鱼络
摘要: 求教一个正则表达式的超级难题,再搞不定就要被炒鱿鱼络
如下
有字符串如
str=<head>
333 < 444</head>
4 < 6
55 < 66
现要求匹配每个标签,如果标签后有内容,需把内容一起匹配
就是说要求结果匹配结果分组如下
1:
2:<head>
3:
333<444
4:5:</head>
6:
4 <6
........
我只能做到下面这步,但这样就匹配不到“<”号以及后面的字符了
Matcher m =
Pattern.compile("(/w+>)[^<]*|(//w+>)|(/w+/>)").matcher(str);
请高人不吝指教啊!!!!!!!!!!
连 < 也要匹配??
是啊,难就难在又要匹配内容中的 "<" 但又不能匹配标签的“<”
根据>找<,就怕会出现多余的>
这个有什么特别的吗?
那就别用正则表达式算了。。
别用正则表达式,那怎么弄,请问
没有汽车,难度就不能出门了?
正则表达式不好用,就自己写代码呗
在什么应用中会有这样的字符串,小于号肯定需要转换
(/w+>)//s*//d+[^<]//d+|(//w+>)|(/w+/>)
空白符没补全
(/w+>)//s*//d+//s*[^<]//s*//d+//s*|(//w+>)|(/w+/>)
可不可以利用jdom来解析?
为什么一定要用正则表达式?我觉得这种情况不适合正则表达式。
建议楼主用其他方法解决,比如说压栈判断。
需求再说一下阿,没有看懂,先给点建议
在部分,建议改为"<(//w+)>(//1)>",其中/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+)>(.*)//1>|<(//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("" + m.group(1) + ">");
}
}
return list;
}
}
输出:
1:
2: <head>
3: 333 < 444
4:
5: </head>
6: 4 < 6
7:
8: 55 < 66
9:
10:
11:
太谢谢了啊
shine333