我想从文本中提取3-5个长度。下面的模式适用于我的所有情况。
Pattern pattern = Pattern.compile("(^|[\\D]|.*[\\D])(?<number>[0-9]{3,5})($|[\\D]|[\\D].*)");
//Working examples always returns 111
//Matcher m = pattern.matcher("XX 111, YYY 37124091");
//Matcher m = pattern.matcher("XX 111");
//Matcher m = pattern.matcher("X111");
//Matcher m = pattern.matcher("111");
我遇到的唯一问题是,我认为模式应该从下面的例子(111,123)中找到几个匹配,而不是只返回123
Matcher m = pattern.matcher("XX 111, CCC 123 YYY 37124091");
while(m.find()){
System.out.println(m.group("number");
}
如何确定模式确实匹配了2次,或者为什么它不匹配111和123?
答案 0 :(得分:3)
只需将其更改为惰性量词。
# "(^|[\\D]|.*?[\\D])(?<number>[0-9]{3,5})($|[\\D])"
( # (1 start)
^
| [\D]
| .*? [\D]
) # (1 end)
(?<number> # (2 start)
[0-9]{3,5}
) # (2 end)
( # (3 start)
$
| [\D]
) # (3 end)
输出:
** Grp 0 - ( pos 0 , len 7 )
XX 111,
** Grp 1 - ( pos 0 , len 3 )
XX
** Grp 2 - ( pos 3 , len 3 )
111
** Grp 3 - ( pos 6 , len 1 )
,
-----------------
** Grp 0 - ( pos 7 , len 9 )
CCC 123
** Grp 1 - ( pos 7 , len 5 )
CCC
** Grp 2 - ( pos 12 , len 3 )
123
** Grp 3 - ( pos 15 , len 1 )
答案 1 :(得分:1)
我遇到的唯一问题是,我认为模式应该从下面的例子(111,123)中找到几个匹配,而不是只返回123
你需要让*
量词不愿意而不是贪婪。
为您的数据
XX 111, CCC 123 YYY 37124091
.*\\D
部分将能够匹配
"XX 111, CCC "
^---------^^
| |
.* \\D
消费111
。
尝试更改
Pattern.compile("(^|\\D|.*\\D)(?<number>[0-9]{3,5})($|\\D|\\D.*)");
到
Pattern.compile("(^|\\D|.*?\\D)(?<number>[0-9]{3,5})($|\\D|\\D.*?)");
//add these ^ ^
同样\\D
本身也是一个角色类,所以你不需要用[..]
包围它。换句话说,您不需要将其写为[\\D]
,简单\\D
就足够了。
如何识别模式确实匹配2次
正则表达式不会记住以前匹配的所有结果。如果您只想获取唯一值,请将它们存储在Set中。
答案 2 :(得分:-1)
要识别三到五位数字,您需要使用类似\b[1-9]\d{2,4}\b