2016-12-25 101 views
3

我想拍攝從一個字符串,它必須包含以下三個子字符串模式三個子字符串:正則表達式:捕捉句子如果字符串包含特定模式

  1. 生日(以YYYYMMDD格式的所有號碼)
  2. ID號(與字符開頭,後面數字)
  3. 全名

如果三個子字符串模式不可用,則返回不匹配。

模式樣品:

XD079523 ALFRED ROMEO 19830311 
ALFRED BETA GAMMA 19830311 AD929523 
BETA FERNANDEZ AS079523 19830311 
19830311 BETA MAX AS079523 
KK079523 19830311 ANGEL MARINA VINES 
19830121 BX079523 VINCENT EVERHART 

我已經嘗試了以下的正則表達式:

/(?=.*\b([a-z]{1,2}\d+)\b)(?=.*\b(\d+)\b)(?=.*((?:\b[a-z]+\b\s*)+)).+/mi 

測試:https://regex101.com/r/iypQuC/1

使用上述圖案,我可以成功地捕獲生日& ID號碼,而不是全名。該模式僅捕獲全名中的最後一個單詞。

對此有何建議?

謝謝。

回答

4

那麼問題很明顯是因爲greediness(?=.*((?:\b[a-z]+\b\s*)+))。你可以通過在?之後製作.*來減少想要的單詞。我會additonally建議重構這部分具有更高的精度:

^(?=.*?\b([a-z]{1,2}\d+)\b)(?=.*?\b(\d+)\b)(?=.*?\b([a-z]+(?:\h+[a-z]+)*)\b).+ 
  • 進一步作出一切.*.*?(也爲更好的性能)
  • 新增^錨只在啓動觸發向前看符號

See your updated demo at regex101

+0

謝謝。我確實需要重新學習「貪婪」。 – RYT

+0

不用客氣@RYT很高興幫助(: –

相關問題