我下面的regexp应该过滤掉长度为8-10的大写单词,其中0-2数字可能出现。它一直适用于我的所有测试,但出于某种原因,它被困在下面的字符串上。n.group(0)
只包含一个空字符串,而不是匹配的"word“。
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
匹配?
我想过滤掉的一些示例(它正在起作用):
等等。
发布于 2012-11-27 23:41:34
我没有比Ωmega的答案提供更好的解决方案,但我想我可以解释发生了什么。归根结底,第一个\b
和最后一个\b
匹配相同的位置:就在冒号之后。
这是前瞻可以匹配的第一个位置,因为它后面是9个数字和一个单词边界。然后,regex的下一部分尝试匹配两个数字(带有任意数量的大写字母),后面跟着一个单词边界,然后失败。因此,它试图只匹配一个数字(同上),然后再次失败。然后,它尝试匹配零位数(中间有零个字母),然后成功,而不提升匹配位置。这个位置仍然是一个单词边界,所以最终的\b
也成功了。
单词边界只是另一个零宽度断言,就像查找头和后视镜一样。没有理由不能在同一个位置应用两个或两个以上的词;您是故意使用第一个单词边界和“前瞻性”的。如果将量词应用于断言(如\b+
),有些正则表达式将其视为错误,但我认为它们中的任何一个都不会解决这个问题。这是一种罕见的情况,在这种情况下,单独的单词开始断言和单词结束断言,比如GNU的\<
和\>
,或者TCL的\y
和\Y
,都会产生不同的效果。
https://stackoverflow.com/questions/13593539
复制相似问题