长度匹配在Java正则表达式

我的代码:

Pattern pattern = Pattern.compile("a?");
Matcher matcher = pattern.matcher("ababa");
while(matcher.find()){
   System.out.println(matcher.start()+"["+matcher.group()+"]"+matcher.end());
}

输出:

0[a]1
1[]1
2[a]3
3[]3
4[a]5
5[]5

我知道的 :

  • “一个?” 代表字符'a'的零次或一次出现。
  • Java API说:

  • matcher.start()返回前一次匹配的开始索引。
  • matcher.end()返回匹配的最后一个字符后的偏移量。
  • matcher.group()返回前一次匹配所匹配的输入子序列。 对于输入序列为s的匹配器m,表达式m.group()和s.substring(m.start(),m.end())是等价的。 对于某些模式,例如a *,匹配空字符串。 当模式成功匹配输入中的空字符串时,此方法将返回空字符串。
  • 我想知道的是:

  • 正则表达式引擎在哪些情况下遇到给定字符的零次出现 - 这里是字符'a'。
  • 在那些情况下,匹配器中的start(),end()和group()方法实际返回值。 我已经提到了java API所说的。 但就上述实际情况而言,我还不太清楚。

  • 这个? 是一个贪婪的量词,因此它会先尝试匹配1次出现,然后再尝试0次出现。 在你的字符串中,

  • 它从第一个字符'a'开始并尝试再次匹配1次发生。 'a'字符匹配,所以它返回你看到的第一个结果
  • 然后它向前移动并找到'b'。 'b'字符与您的正则表达式1出现不匹配,所以引擎回溯并尝试匹配0次出现。 结果是空字符串匹配 - >你得到第二个结果。
  • 那么它会在b之前移动,因为在那里没有更多的匹配可能,并且它会再次以您的第二个'a'字符开始。
  • 等等......你明白了......
  • 这比这更复杂一些,但这是主要想法。 当1次出现不匹配时,它会尝试0次出现。

    至于开始,结束和组的值,它们将会是匹配开始的位置,结束和组匹配的内容,因此在字符串的第一个0匹配匹配中,会得到1,1,并且该字符串。 我不确定这真的会回答你的问题。


    遍历几个例子会清除matcher.find()的功能:

    正则表达式引擎从字符串中获取一个字符(即,ababa),并尝试查找您正在寻找的字符串中的模式是否可以找到。 如果模式存在,那么(如API所述):

    matcher.start()返回起始索引,matcher.end()返回匹配的最后一个字符后的偏移量。

    如果匹配不存在。 然后start()和end()返回相同的索引,这符合匹配的长度为零。

    看下面的例子:

            // Searching for string either "a" or ""
            Pattern pattern = Pattern.compile("a?");
            Matcher matcher = pattern.matcher("abaabbbb");
            while(matcher.find()){
               System.out.println(matcher.start()+"["+matcher.group()+"]"+matcher.end());
            }
    

    输出:

        0[a]1
        1[]1
        2[a]3
        3[a]4
        4[]4
        5[]5
        6[]6
        7[]7
        8[]8
    
    
          // Searching for string either "aa" or "a"
           Pattern pattern = Pattern.compile("aa?");
        Matcher matcher = pattern.matcher("abaabbbb");
        while(matcher.find()){
           System.out.println(matcher.start()+"["+matcher.group()+"]"+matcher.end());
        }
    

    输出:

    0[a]1
    2[aa]4
    
    链接地址: http://www.djcxy.com/p/76991.html

    上一篇: length matches in Java Regex

    下一篇: Java Stringparsing with Regexp