用 `regex` 匹配字符串末尾的 phone 数字,并且 return 两个部分
Matching a phone number at the end of a string with `regex`, and return both parts
我有一堆像下面这样的行:
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
我想确定并 return 其中包含的姓名和号码。例如,我想 return:
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
)上,它 return 如下:
Name: Name1 Surname1 +44 (020) 1234
Number: 5678
我认为造成这个结果的原因是 regex
太贪心了,但我不明白如何修改它的行为。
任何人都可以更正模式并简单地向我解释解决方案吗?我阅读了一些教程但不了解该怎么做。提前致谢!
我现在能想到的最简单的是
^(.*?)\s*((?:\+|\()[-\d(). ]*)
它捕获所有 到 +
或 (
之前的空格。然后它将之后的所有内容(数字、连字符、括号、点或空格)捕获到第二组。
我有一堆像下面这样的行:
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
我想确定并 return 其中包含的姓名和号码。例如,我想 return:
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
)上,它 return 如下:
Name: Name1 Surname1 +44 (020) 1234
Number: 5678
我认为造成这个结果的原因是 regex
太贪心了,但我不明白如何修改它的行为。
任何人都可以更正模式并简单地向我解释解决方案吗?我阅读了一些教程但不了解该怎么做。提前致谢!
我现在能想到的最简单的是
^(.*?)\s*((?:\+|\()[-\d(). ]*)
它捕获所有 到 +
或 (
之前的空格。然后它将之后的所有内容(数字、连字符、括号、点或空格)捕获到第二组。