2014-01-22 36 views
2

我想創建一個匹配模式的正則表達式,但如果最後一組長度不是4個字符,則匹配不匹配。正則表達式只匹配最後一組長度爲n個字符

實施例:
正則表達式:({1,} - )({1,} - )({1,} - )(\ d {4,4})
好輸入:A- AAAA-A-0001
壞輸入:A-AAAA-A-00011

我正則表達式失敗時,它從兩個輸入

回答

3

以下正則表達式將從一個字符串內部拾取匹配(即它會找到匹配的子字符串):

(?<=\s|^)([^\s]+-){3}(\d{4})(?=\s|$) 

下面將拿起匹配整個字符串僅

^([^\s]+-){3}(\d{4})$ 

我已經簡化您正則表達式一點,但做你使用每組字的東西不是假設。

我把你的:

(.{1,}-)(.{1,}-)(.{1,}-) 

進入

([^\s]+-){3} 

它說「匹配任何不是空白,並用破折號恰好3次結束的‘+’操作符是速記話說{1]或 「至少一次」。

我們能更具體?

我懷疑你可能只想匹配字母數字值。例如,我懷疑$-A%^[email protected]是否適合您。如果我是正確的這一點,你要使用速記字符類,這將使你的正則表達式是這樣的,而不是(我假設你的正則表達式是區分大小寫):

匹配字符串:

(?<=\s|^)([A-Za-z\d]+-){3}(\d{4})(?=\s|$) 

匹配整個字符串:

^([A-Za-z\d]+-){3}(\d{4})$ 

幾個指針:

  • 除了指定{4,4}說「正好4倍」,只是用 {4}
  • 除了指定{1,}說「1次以上」的,只是使用 +
  • (?={regex in here})手段,向前看的字符串和比賽中的但不要將它添加到我的結果中(它被稱爲積極lookahead)
  • (?<={regex in here})意味着,在字符串中向後看並匹配以下內容,但不要將其添加到我的結果中(它被稱爲積極lookbehead )
  • 也有消極的樣子相反,但我會留給你去研究。
+0

感謝指針,他們真的很有幫助。 – Cogslave

+0

如果您熱衷於正則表達式,由於某種原因,我可能想要查看名爲RegexBuddy的應用程序。對於初學者來說,這對於專家來說非常棒。您可以插入測試數據並編寫正則表達式,並查看它實時提取的匹配項。它也有非常好的上下文幫助,一個可視化的正則表達式構建器,可以將正則表達式解碼爲純英語,還可以將完成的正則表達式導出到任意數量的編程語言(如果您使用的語言不受支持,它也會發出警告)。我並不隸屬於那些一直喜歡這款產品的人 –

1

首先,我建議你稍微簡化一下你的正則表達式。我的建議是:

(\w+-){3}(\d{4}) 

既然你有3組後跟一個-標誌字字符,這是非常簡單的。現在

,爲了捕捉只有那些期望的比賽,如果你正在測試正是這些字符串,你只需要添加^$分隔符。

^(\w+-){3}(\d{4})$ 

請檢查this Regex101 link以查看它的行動。

相關問題