我有一堆这样的话:

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


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


Name1 Surname1 +44 (020) 1234 5678


名称:Name1 Surname1
编号:+44 (020) 1234 5678

Name2 Name2 Surname2 +39 (051) 12.34.56


名称:Name2 Name2 Surname2
编号:+39 (051) 12.34.56

Surname3, Name3 - (555) 123-456-789


名称:Surname3, Name3 -
编号:(555) 123-456-789

Surname4, Name4 Name4 123 - 456.78.90


名称:Surname4, Name4 Name4
编号:123 - 456.78.90



我正在使用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过于贪婪,但我不知道如何修改其行为。

谁能更正此模式并以简单的方式向我解释解决方案?我看了一些教程,却不知道该怎么做。提前致谢!

最佳答案

我现在想到的最简单的方法是

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


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

Check it out here at regex101

10-01 09:32