首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >regexp Matcher的Wierd行为

regexp Matcher的Wierd行为
EN

Stack Overflow用户
提问于 2012-11-27 21:37:51
回答 1查看 65关注 0票数 0

我下面的regexp应该过滤掉长度为8-10的大写单词,其中0-2数字可能出现。它一直适用于我的所有测试,但出于某种原因,它被困在下面的字符串上。n.group(0)只包含一个空字符串,而不是匹配的"word“。

代码语言:javascript
运行
复制
static final Pattern PATTERN = 
    Pattern.compile("\\b(?=[A-Z\\d]{9,10}\\b)(?:[A-Z]*\\d){0,2}[A-Z]*\\b");

Matcher n = LONG_PASSWORD.matcher("foo ID:636152727 bar");

while (n.find()) {
    String s = n.group(0);                  
    resultArrayList.add(s);
}

为什么我的模式与ID:636152727匹配?

我想过滤掉的一些示例(它正在起作用):

  • AAAAAAAAAA
  • 1AAAAAAAAA
  • 1AAAAAAAA1

等等。

EN

回答 1

Stack Overflow用户

发布于 2012-11-27 23:41:34

我没有比Ωmega的答案提供更好的解决方案,但我想我可以解释发生了什么。归根结底,第一个\b和最后一个\b匹配相同的位置:就在冒号之后。

这是前瞻可以匹配的第一个位置,因为它后面是9个数字和一个单词边界。然后,regex的下一部分尝试匹配两个数字(带有任意数量的大写字母),后面跟着一个单词边界,然后失败。因此,它试图只匹配一个数字(同上),然后再次失败。然后,它尝试匹配零位数(中间有零个字母),然后成功,而不提升匹配位置。这个位置仍然是一个单词边界,所以最终的\b也成功了。

单词边界只是另一个零宽度断言,就像查找头和后视镜一样。没有理由不能在同一个位置应用两个或两个以上的词;您是故意使用第一个单词边界和“前瞻性”的。如果将量词应用于断言(如\b+),有些正则表达式将其视为错误,但我认为它们中的任何一个都不会解决这个问题。这是一种罕见的情况,在这种情况下,单独的单词开始断言和单词结束断言,比如GNU的\<\>,或者TCL的\y\Y,都会产生不同的效果。

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

https://stackoverflow.com/questions/13593539

复制
相关文章

相似问题

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