<font>1<font>2<font>n</font></font></font>,如何能匹配到最外一层或所有嵌套层,n不定。
<font>((?!</?font>).|(<font>((?!</?font>).)*</font>))*</font>
只能匹配到固定层次的内容。
谢谢。
<font>((?!</?font>).|(<font>((?!</?font>).)*</font>))*</font>
只能匹配到固定层次的内容。
谢谢。
Pattern p = Pattern.compile("(?<=<font>)(.*?)(?=</?font>)");
Matcher m = p.matcher(font);
while(m.find())
System.out.println(m.group(1));参考.
刚才是我打错了。
不过,我需要的结果不是1,2,n。
我是需要下面这样的结果,也就匹配解析一个html文档结构。
<font>1<font>2<font>n</font></font></font>
<font>2<font>n</font></font>
<font>n</font>
PHP 和 GRETA 的简便之处在于,匹配嵌套(n-1)层的表达式用 (?R) 表示。
但JAVA不支持?R这样的嵌套匹配,想用相应的替代办法解决。如果没有好的解决办法,那么就采用逐层递归匹配的方法:
先找到:
<font>1<font>2<font>n</font></font></font>
再在以上的结果中找:
<font>2<font>n</font></font>
再再在以上的结果中找:
<font>n</font>现在想解决的:
1、能否找到嵌套匹配的方法?
2、能否匹配到最外层(正则表达式)?
Pattern p = Pattern.compile("(<font>.*</font>)");
Matcher m = p.matcher(font);
while(m.find()){
System.out.println(m.group(1));
p=Pattern.compile("(?<=<font>\\w)(.+)(?=</font>)");
m=p.matcher(m.group(1));
}这样试试.
p=Pattern.compile("(?<=<font>\\w)(.+)(?=</font>)");
这句正则不了解,能帮忙解释下吗?
和"(<font>.*</font>)"有什么区别?
(<font>.*</font>)包含<font>和</font>
但两者的区别是怎样的?
?<=表示不以<font>开头吗?
?=应该是表示正向预查找,在这里表示什么意思呢?
能否帮忙解释的更详细些,非常感谢。
(?<=<font>\\w)断言表达式的前面含有<font>\\w
(?=</font>)断言表达式的后面面含有</font>
这只能说明(.+)的前面含有<font>\\w ,后面含有</font>,也就是说它是被包含在<font>和</font>中,但他们之间应该是可以包含<font></font>的,也就是说它中间还有嵌套的。
可以这样理解吗?
(<font>.*</font>)这个表达式会有一个问题,如<font>1<font>2<font>n</font></font></font>a<font>b</font>
它会匹配成:<font>1<font>2<font>n</font></font></font>a<font>b</font>
期待的正确结果是得到两组匹配内容:
1、<font>1<font>2<font>n</font></font></font>
2、<font>b</font>能否再予指点?
另外,推荐的教程很棒,是我目前看过最棒的。
Pattern p = Pattern.compile("((<font>\\w)+(</font>)+)");
Matcher m = p.matcher(font);
while(m.find()){
Matcher m1 = p.matcher(m.group(1));
while(m1.find()){
System.out.println(m1.group(1));
Pattern p1=Pattern.compile("(?<=<font>\\w)(.+)(?=</font>)");
m1=p1.matcher(m1.group(1));
}
}
(?<=<font>\\w)(.+)(?=</font>) 表示<font>和</font>之间最大字符串匹配.
匹配:<font>1<font>2<font>n</font></font></font>
(?<=<font>\\w)(.+?)(?=</font>)表示<font>和</font>之间最小字符串匹配(惰性匹配).
匹配:<font>n</font>
(?<=<font>\\w)(.+)(?=</font>)
String font="<font>1<font>2<font>n</font></font></font>a<font>b</font>";
这个为什么不会匹配到
<font>1<font>2<font>n</font></font></font>a<font>b</font>
而只匹配到
<font>1<font>2<font>n</font></font></font>
呢?
从理论上好象不太对,我再试试。二、
(?<=<font>\\w)(.+?)(?=</font>)
匹配的不是<font>2<font>n</font></font>,是不是因为?<=起到作用,?<=表示表达式前必须含有<font>,但又不包含自身,于是就把第二层的font给排除了,于是匹配到了这里面层的<font>n</font>,可以这样理解吗?
那么
Pattern p1=Pattern.compile("(?<=<font>\\w)(.+)(?=</font>)");
正确的应该是:
Pattern p1=Pattern.compile("(?<=<font>\\w)(.+?)(?=</font>)");
吗?
String font="<font>1<font>2<font>n</font></font></font>a<font>b</font>";
使用((<font>\\w)+(</font>)+)这个匹配的目的是得出以下字符串:
(1) <font>1<font>2<font>n</font></font></font>
(2)<font>b</font>
而(?<=<font>\\w)(.+)(?=</font>)的目的是得到每一层的匹配.
对于以上的(1)来说得到
<font>1<font>2<font>n</font></font></font>
<font>2<font>n</font></font>
<font>n</font>
(2)就只有自己了,没有嵌套.
第二问,你这个问题里边不适于用惰性匹配