写正则表达式的一个小例子遇到一个奇怪的问题。
在打印匹配的字符串的循环中调用了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());
} }}

解决方案 »

  1.   

    楼主看一下API文档的说明,lookingAt()“尝试将从区域开头开始的输入序列与该模式匹配”,matches()是“尝试将整个区域与模式匹配”。匹配正则的时候有个游标的,你调用find()方法找到了某个匹配,就会把游标移动到该匹配的位置,这个时候你又调用lookingAt()或者matches(),得了,又把游标移到开始位置了,然后又执行find()方法,又把游标移动到第一个匹配的位置,又调用lookingAt()或者matches(),又把游标移到开始位置了,不是死循环才有鬼。
      

  2.   


    谢谢,这个可能我想过,但是我还要问,如果像你说的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朋友,还能帮我解释下吗?
      

  3.   

    开始我也像1楼这么想的,合情合理。但是实验了一下,原因应该不这么简单:    String testString = "Never give up! Never surrender!Never shut up!";//改成这样3次匹配将正常find()一圈后退出,如果是2个匹配的则陷入死循环
        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次匹配有区别,但没总结出来原因,也许是观察还不够仔细。估计要等果子兄了。
      

  4.   

    又看了看,问题应该在“find一轮的最后1次成功匹配的last如果是在结尾”将陷入循环。
    String testString = "Never give up! Never surrender!Never shut up!";
    String regularException = "Never";//never就可以顺利出来,"Never.{8,10}"出不来。
      

  5.   

    死了一试,还是有点晕把正则表达式该为"Never.*?!"
    循环中调一次matchs和调lookingAt又不一样
      

  6.   

    我也快晕了。
        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如果是在结尾”将陷入循环。
    是个错误结论。