2014-04-25 212 views
2

我有以下RegexC#匹配字母,數字和特殊字符的正則表達式

[A-Z]{2}[0-9]{4} 

,並與像這樣的字符串完全符合:AB1234。但我必須改善這種Regex,以配合這些具體的規則:

  • 字符串必須只有2個銳器(##)每組(AB1234##AB1234
  • 它可以有8組串之間( AB1234##AB1234##AB1234##AB1234##AB1234##AB1234##AB1234##AB1234
  • 無論組數如何,最後一組在末尾都不能有銳利數字(##)。所以,如果我有3個組,它會看起來像這樣:AB1234##AB1234##AB1234

如果我使用的樣本串從第二個小點,我Regex將匹配的模式,但在這種情況下,它不會validade每組之間的字符。

任何人都可以幫助我改進這個正則表達式嗎?

+0

爲了提供有意義的反饋,我可能只是分割###,然後將簡單的正則表達式應用到數組中的每個項目。 – Travis

+0

@Travis是的,你是對的,但我必須驗證完整的字符串,而不是每個組。 –

回答

2

試試這個:

^([A-Z]{2}[0-9]{4}##){0,7}([A-Z]{2}[0-9]{4})$ 
1
([A-Z]{2}[0-9]{4}##){0,7}([A-Z]{2}[0-9]{4}) 
+0

如果我在最後放置了一個組,它將進行驗證。實際上,它找到了2組。 –

+0

請澄清。這是正確的還是不正確? –

+1

不,我在最後添加了一個'## AB1234',並繼續驗證。如果我用'^'開始你的模式並用'$'完成,它就可以工作。 –

1

您可以結合RegexLINQ然後使用擴展方法是這樣的:

public static bool Validate(this string source) 
{ 
    string pattern = "[A-Z]{2}[0-9]{4}"; 
    return !source.StartsWith("##") && 
      !source.EndsWith("##") && 
      source.Split(new[] {"##"}, StringSplitOptions.RemoveEmptyEntries) 
       .All(x => Regex.IsMatch(x, pattern)); 
} 

用法:

bool t1 = "AB1234##AB1234".Validate(); // true 
bool t2 = "AB1234##AB1234##AB1234".Validate(); // true 
bool t3 = "AB1234##AB1234##" // false 
+1

這是一個好主意,但我真的需要用正則表達式來做到這一點。 –

0
^(?:[A-Z]{2}[0-9]{4})(?:##(?:[A-Z]{2}[0-9]{4})){0,7}$ 
    ^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^ ^^^ 
      (1)     (2)   (3) 
  1. 匹配至少一個以兩個大寫字母開頭的字符串,後跟4個十進制數字。
  2. 可選地,按照##從0到7次重複第一次匹配。

結果:*指示匹配)

* AB1234 
    AB1234x 
* AB1234##AB1234 
* AB1234##AB1234##AB1234 
    AB1234##AB1234##AB1234x 

live demo

注:這個答案和this other answer很相似。然而,這裏的答案始於假設至少有一個序列AB1234存在。然後它允許的可能性它被##AB1234跟隨0到7次。最後,這兩個正則表達式都很好。這歸結於個人偏好。

另請注意,我使用非捕獲組(?:...)來避免創建在此情況下不需要的捕獲組的不必要開銷。 (捕獲組也被稱爲後向引用。)

相關問題