写正则表达式的一个小例子遇到一个奇怪的问题。
在打印匹配的字符串的循环中调用了m.lookingAt()或m.matchs()居然出现死循环...如果不调用确不会出现这种情况。是这两个方法影响的么?查了api,看了源码,都不知道所以然,求高手指点下。在线等ing...public class TestRegularExpression { /**
* @param args
*/
public static void main(String[] args) {
String testString = "Never give up! Never surrender!";
String regularException = "Never.{8,10}!";
System.out.println(regularException); Pattern p = Pattern.compile(regularException);
Matcher m = p.matcher(testString);
int i = 0;
while (m.find()) {
System.out.println("Match \"" + m.group() + "\" at positions "
+ m.start() + "-" + (m.end() - 1));
System.out.println(m.lookingAt());
System.out.println(m.matches());
} }}
在打印匹配的字符串的循环中调用了m.lookingAt()或m.matchs()居然出现死循环...如果不调用确不会出现这种情况。是这两个方法影响的么?查了api,看了源码,都不知道所以然,求高手指点下。在线等ing...public class TestRegularExpression { /**
* @param args
*/
public static void main(String[] args) {
String testString = "Never give up! Never surrender!";
String regularException = "Never.{8,10}!";
System.out.println(regularException); Pattern p = Pattern.compile(regularException);
Matcher m = p.matcher(testString);
int i = 0;
while (m.find()) {
System.out.println("Match \"" + m.group() + "\" at positions "
+ m.start() + "-" + (m.end() - 1));
System.out.println(m.lookingAt());
System.out.println(m.matches());
} }}
谢谢,这个可能我想过,但是我还要问,如果像你说的lookingAt或matchs把游标移动到起始位置,那应该是死循环输出第一次匹配,但是输出结果却是:
Never.{8,10}!
Match "Never give up!" at positions 0-13
false
Match "Never surrender!" at positions 15-30
false
Match "Never surrender!" at positions 15-30
false
Match "Never surrender!" at positions 15-30
false
Match "Never surrender!" at positions 15-30
false
Match "Never surrender!" at positions 15-30
false
Match "Never surrender!" at positions 15-30
false
Match "Never surrender!" at positions 15-30
false
Match "Never surrender!" at positions 15-30
false
Match "Never surrender!" at positions 15-30
false
Match "Never surrender!" at positions 15-30
false
Match "Never surrender!" at positions 15-30
false朋友,还能帮我解释下吗?
String regularException = "Never"; System.out.println(regularException); Pattern p = Pattern.compile(regularException);
Matcher m = p.matcher(testString);
int i = 0;
while (true) {//这么改了改方便调试
i++;//bp1
if(m.find()){
System.out.println("Match \"" + m.group() + "\" at positions "
+ m.start() + "-" + (m.end() - 1));//bp2
System.out.println(m.matches());
if (i > 200) {//bp3
break;
}
}else{
break;
}
}下了断点观察了matcher的first,last,oldlast等几个属性,原文字2次匹配和3次匹配有区别,但没总结出来原因,也许是观察还不够仔细。估计要等果子兄了。
String testString = "Never give up! Never surrender!Never shut up!";
String regularException = "Never";//never就可以顺利出来,"Never.{8,10}"出不来。
循环中调一次matchs和调lookingAt又不一样
String testString = "Never give up! Never give up!Never give up!Never give up!";
String regularException = "Never give up!";//定长(固定的字符串非正则形式的)的可以正常走出,但如果Never.{8,10}!这种不定的将在第2论匹配那里循环。如果要深究,可能从这里入手吧。
上面我说的
又看了看,问题应该在“find一轮的最后1次成功匹配的last如果是在结尾”将陷入循环。
是个错误结论。