我有一堆这样的话:
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。