我尝试使用以下正则表达式从字符串Personal number: 123456
中提取个人号码:
(Personal number|Personalnummer).*(\d{2,10})
尝试获取第二组时,它只包含个人号码的最后2位数字。如果我将数字范围更改为{3,10}
,它将匹配个人号码的最后3位数。
现在我不能只将空格添加为附加组,因为我无法确定是否总会有空格 - 可能没有空格或其他字符,但个人编号总是在最后。
无论如何,我可以指示Parser获取整个数字字符串吗?
答案 0 :(得分:5)
.*
正在作为正则表达式的贪婪量词。它最终会吃掉所有匹配的字符,除了它必须离开以匹配字符串的最后2个字符。
您必须通过应用?
来使其不情愿。如下所示
(Personal number|Personalnummer).*?(\d{2,10})
现在它应该完美无缺。
您还可以将第一组转换为非捕获组,然后您将只得到您想要的答案中的数字,如下所示。
(?:Personal number|Personalnummer).*?(\d{2,10})
答案 1 :(得分:1)
在通配符匹配上使用不情愿的quantifier(例如*?
)。例如,.*?
将生成完整的数字表达式:
Pattern p = Pattern.compile("(Personal number|Personalnummer).*?(\\d{2,10})");//note the ?
Matcher m = p.matcher("Personal number: 123456");
if ( m.find() ){
System.out.println(m.group(2));
}