将字符串末尾的电话号码与`regex`匹配,并返回两个部分

时间:2016-07-08 13:36:37

标签: java regex regex-greedy

我有一堆如下所示的行:

Name1 Surname1         +44 (020) 1234 5678 
Name2 Name2 Surname2   +39 (051) 12.34.56
Surname3, Name3      -     (555) 123-456-789
Surname4, Name4 Name4       123 - 456.78.90

我想识别并返回它们包含的名称和数字。例如,我想回复:

  1. Name1 Surname1 +44 (020) 1234 5678
    • 名称:Name1 Surname1
    • 号码:+44 (020) 1234 5678
  2. Name2 Name2 Surname2 +39 (051) 12.34.56
    • 名称:Name2 Name2 Surname2
    • 号码:+39 (051) 12.34.56
  3. Surname3, Name3 - (555) 123-456-789
    • 名称:Surname3, Name3 -
    • 号码:(555) 123-456-789
  4. Surname4, Name4 Name4 123 - 456.78.90
    • 名称:Surname4, Name4 Name4
    • 号码:123 - 456.78.90
  5. 我正在使用 Java regex,到目前为止,我提出了以下模式:

    \A(.*)\s+(\+?\s*\d+([.-\s]*(\d+|\(\d+\)))+)\z
    

    如果line是以上任何一行,则匹配该模式的代码为:

    Pattern pattern = Pattern.compile("^(.*)\\s+(\\+?\\s*\\d+([.-\\s]*(\\d+|\\(\\d+\\)))+)$");
    Matcher matcher = pattern.match(line);
    if (matcher.find()) {
        System.out.println("Name: " + pattern.group(1));
        System.out.println("Number: " + pattern.group(2));
    }
    

    不幸的是,在任何line(例如Name1 Surname1 +44 (020) 1234 5678)上,它会返回以下内容:

    Name: Name1 Surname1         +44 (020) 1234
    Number: 5678
    

    我认为这个结果的原因是regex过于贪婪,但我不明白如何修改它的行为。

    任何人都可以纠正这种模式并用简单的术语解释我的解决方案吗?我读了一些教程而不了解该怎么做。提前谢谢!

1 个答案:

答案 0 :(得分:2)

我现在能想到的最简单的就是

^(.*?)\s*((?:\+|\()[-\d(). ]*)

它捕获最多 +(之前的所有空格。然后它将之后的所有内容(数字,连字符,括号,点或空格)捕获到第二组。

Check it out here at regex101