2013-10-25 61 views
0

給定一個字符串,例如「fooBAR」,我希望匹配字符串末尾的大寫字母(即「BAR」)以及下面的扭曲:正則表達式匹配字符串尾部的大寫字母

  1. 匹配必須包含至少兩個字母
  2. 的匹配必須包含任何以下的:1D,2D,3D,4D

實例:

"fooB" -> "" 
"fooBAR" -> "BAR" 
"foo64BAR" -> "BAR" 
"foo64BR" -> "BR" 
"fooDBAR" -> "DBAR" 
"foo12BAR" -> "BAR" 
"foo1DBAR" -> "BAR" 

的瑣碎的正則表達式

[A-Z][A-Z]+ 

失敗最後一個例子中(返回 「DBAR」 而不是 「BAR」。)

負回顧後如

(?<![1-4D])[A-Z][A-Z]+ 

也失敗的最後一個例子(返回「AR」而不是「BAR」)。

我有一種感覺,這應該很簡單,但對於我的愛我無法找到解決方案。有任何想法嗎?

+0

經過測試,它沒有區別。 –

+0

然後輸入'fooBarABC1DB'應該匹配什麼?沒有或「ABC」? –

+0

它不應該返回。 –

回答

0

以下應該工作:

(?!(?<=[1-4])D)[A-Z]{2,}$ 

主正則表達式這裏是[A-Z]{2,},這將在一個字符串的末尾匹配兩個或更多個大寫字符。負面預測(?!(?<=[1-4])D)涵蓋了您的其他要求。如果前一個字符是從1到4的數字,並且下一個字符是D,則可以將其讀作「失敗」。

如果要在行尾而不是字符串末尾匹配,請使用RegexOptions.Multiline

例子:http://rubular.com/r/XgKv9pavJd

+0

不知道你爲什麼加了結尾錨'''? – HamZa

+2

該問題明確聲明他正在字符串的末尾尋找匹配項。 –

+0

我剛剛測試過它,它只匹配最後一個測試「foo1DBAR」 - >「BAR」? –

2

我只是去與一些簡單的圖案與一些代碼相結合,沿着這些線路:

string GetMatch(string input) 
{ 
    var match = Regex.Match(input, @"\d?([A-Z]{2,})$"); 
    if (Regex.Match(match.Value, @"^[1-4]D").Success) 
     return match.Groups[1].Value.Substring(1); 
    else 
     return match.Groups[1].Value; 
} 
2

負回顧後不工作,因爲它需要比其他的東西在比賽前1,2,3,4或D.在你的例子中的「B」適合斷言,所以匹配是在那之後的一切。

您需要查找一個不帶前綴1-4的D,後跟另一個大寫字母,或者除D之外的任何字母,後跟另一個大寫字母。

((?<![1-4])D|[ABCE-Z])[A-Z]+$ 
+0

到目前爲止,這是唯一一個可以100%與您的示例一起工作的人 – Jonesopolis

+0

這似乎也適用於所有示例。顯然我不能接受多個答案,所以我會按照時間順序最早一個答案。 –

1

使用正則表達式選項Right To Left從工作進行到底:

(?<![1-4])D?[A-Z-[D]]{2,} 
相關問題