簡體   English   中英

用`regex`匹配字符串末尾的電話號碼,並返回兩個部分

[英]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

我想識別並返回其中包含的名稱和數字。 例如,我想返回:

  1. Name1 Surname1 +44 (020) 1234 5678
    • 名稱: Name1 Surname1姓氏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

我正在使用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(). ]*)

它捕獲 +(之前的空格之前的所有內容。然后捕獲到第二組之后的所有內容(數字,連字符,括號,點或空格)。

在regex101處檢查

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM