正则表达式:匹配通配符,后跟可变长度的数字

时间:2016-08-12 18:15:39

标签: java regex

我尝试使用以下正则表达式从字符串Personal number: 123456中提取个人号码:

(Personal number|Personalnummer).*(\d{2,10})

尝试获取第二组时,它只包含个人号码的最后2位数字。如果我将数字范围更改为{3,10},它将匹配个人号码的最后3位数。

现在我不能只将空格添加为附加组,因为我无法确定是否总会有空格 - 可能没有空格或其他字符,但个人编号总是在最后。

无论如何,我可以指示Parser获取整个数字字符串吗?

2 个答案:

答案 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));
}