首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >模式匹配中不必要的限定符

模式匹配中不必要的限定符
EN

Stack Overflow用户
提问于 2016-05-13 17:08:57
回答 1查看 39关注 0票数 0

我有以下程序

代码语言:javascript
复制
public class PatternMatching {
            public static void main(String[] args) {
                String pattern ="a??";
                Pattern pattern1 = Pattern.compile(pattern);
                String findAgainst = "a";
                Matcher matcher = pattern1.matcher(findAgainst);
                int count=0;
                while(matcher.find()){
                    count++;
                    System.out.println(matcher.group(0)+".start="+ matcher.start()+".end="+matcher.end());
                }
                System.out.println(count);
            }
        }

它打印以下输出

代码语言:javascript
复制
.start=0.end=0
.start=1.end=1
2

而不是

代码语言:javascript
复制
.start=0.end=0
a.start=0.end=1
.start=1.end=1
3

当我使用pattern "b??"运行程序时,输出是

代码语言:javascript
复制
.start=0.end=0
.start=1.end=1
2

这是正确的。输出不正确的原因是什么,即使它是一个不情愿的限定符?

EN

回答 1

Stack Overflow用户

发布于 2016-05-13 17:24:01

在我看来,问题是Java正则表达式引擎在遇到长度为零的匹配时使用以下算法:它将匹配的索引与当前的正则表达式索引进行比较,如果它们一致,则正则表达式索引递增。

因此,当您将a之前的空格与a??进行匹配时,正则表达式引擎会发现长度为零的匹配,并递增出现在a之后的索引,从而跳过正确的匹配。

如果您使用贪婪的版本- a? -输出将会不同:

代码语言:javascript
复制
a.start=0.end=1
.start=1.end=1
2

这是因为使用了第一个a,正则表达式引擎索引在a之后,现在可以匹配字符串的末尾。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37205816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档