2011-04-09 250 views
5

概括地說:我如何將一個單詞與正則表達式規則匹配:a)開始,b)整個單詞,以及c)結束?.NET匹配正則表達式匹配

更具體地說:我如何匹配有以下規則長度> = 1的表達:

  1. 它不能有任何的! @#
  2. 它不能以空格開頭或=
  3. 它不能用空格

我試圖結束:

^[^\s=][^[email protected]#]*[^\s]$ 

但在字^[^\s=]匹配移動經過第一個字符。因此,這也匹配以'!'開頭的單詞或'@'或'#'(例如:'#ab'或'@aa')。這也迫使這個單詞至少有2個字符(一個起始字符不是空格或= - 和 - 最後一個非空格字符)。

我到:

^[^\s=([email protected]#)]\1*$ 

匹配前兩個規則,一個正則表達式。但是,如何匹配單詞中沒有尾部空格並允許長度爲1的單詞?

+2

+1對於我已經在幾周內看到的第一個正則表達式問題,包括以前失敗的嘗試。換句話說,+1是一個*真正的*正則表達式問題。 – 2011-04-09 02:57:32

回答

3

你的第一次嘗試非常接近。你只需要排除更多的字符的第一個和最後一個部分,並進行最後的兩個部分可選:

^[^\[email protected]#](?:[^[email protected]#]*[^\[email protected]#])?$ 

這確保了所有三個部分將不包括任何的[email protected]#。然後,如果該單詞長度超過一個字符,它將需要以非空格結束,只有選擇字符填充中間的空格。由於^$錨點,這一切都得到了正確執行。

我不太清楚你的第二個例子是否匹配,因爲()在嵌入字符類中時應該被當作文字字符,而不是作爲捕獲組。

4

Cameron的解決方案既準確又高效(應該用於需要優化速度的任何生產代碼)。這裏給出的答案效率較低,但是展示了使用正則表達式應用邏輯的一般方法。

您可以使用多個正面和負面的lookahead正則表達式斷言(全部應用於目標字符串中的一個位置 - 通常是開頭),以便爲匹配應用多個邏輯約束。下面的註釋的正則表達式演示了這個例子很容易實現。您需要了解正則表達式引擎如何匹配(並且不匹配),以提出正確的表達式,但是一旦您掌握正確的表達式就不難了。

foundMatch = Regex.IsMatch(subjectString, @" 
    # Match 'word' meeting multiple logical constraints. 
    ^   # Anchor to start of string. 
    (?=[^[email protected]#]*$) # It cannot have any of: ! @ #,  AND 
    (?![ =])  # It cannot begin with a space or =, AND 
    (?!.*\S$)  # It cannot end with a space,  AND 
    .{1,}   # length >= 1 (ok to match special 'word') 
    \z   # Anchor to end of string. 
    ", 
    RegexOptions.IgnorePatternWhitespace); 

「的正則表達式邏輯」的本申請經常用於複雜的密碼驗證。