2017-05-24 110 views
1

我有這個字符串正則表達式匹配總是最後一組第

AC7640 Montreal Trudeau (YUL) La Guardia/New York (LGA) E75 Business (P) Confirmed 我希望它匹配AC7640YULLGA

但是我也想,如果最後一個機場沒有例如存在匹配:

AC7640 Montreal Trudeau (YUL) E75 Business (P) Confirmed

AC7640YUL

我想出了這個正則表達式: ([A-Z]{2}|[A-Z][0-9]|[0-9][A-Z])\s*([0-9]{1,4})(?:.*?\(([A-Z]{3})\)){1,2}

的問題是,它僅匹配1個機場對兩個字符串

我使用python味道

回答

1

你需要「解開」自重複捕獲組僅存儲最後一次出現的模式:

^([A-Z]{2}|[A-Z][0-9]|[0-9][A-Z])\s*([0-9]{1,4}).*?\(([A-Z]{3})\)(?:.*?\(([A-Z]{3})\))? 

S ee regex demo。另請注意,最後一部分(?:.*?\(([A-Z]{3})\))?包含在一個可選的非捕獲組中,以便它可以匹配1或0個匹配項。 ^在開始時使得正則表達式引擎僅從字符串的開頭搜索。

詳細

  • ^ - 字符串的開始
  • ([A-Z]{2}|[A-Z][0-9]|[0-9][A-Z]) - 第1組:兩個大寫字母或upppercase字母和一個數字或一個數字和大寫字母
    • \s* - 0+空格
    • ([0-9]{1,4}) - 第2組:一到四位數
  • .*? - 任何0+字符儘可能少到第一...
  • \( - 一個(
  • ([A-Z]{3}) - 第3組:三個大寫字母
  • \) - )
  • (?:.*?\(([A-Z]{3})\))? - 匹配1或0的非捕獲組(可選)發生次數:
    • .*? - 任何0+字符儘可能少到第一....
    • \( - 一個(
    • ([A-Z]{3}) - 第4組:三個大寫字母
    • \) - 一個)
+0

我愛它,小幅回調但'([AZ] {1,3})'應該是'([AZ] {3})'在這兩種情況下 –

+0

也許吧,但我看到機場代碼可以是1個字符長。那麼,這可以適應。 –

+0

機場代碼總是3個字符 –