2013-06-21 63 views
0

這是簡單的,但我不明白這一點。我想用這個正則表達式找到一個子字符串。它將馬赫 「M4N 3M5」,但不匹配下面:Regex.Match()將不匹配子字符串

const string text = "asdf M4N 3M5 adsf"; 
Regex regex = new Regex(@"^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$", RegexOptions.None); 
Match match = regex.Match(text); 
string value = match.Value; 
+0

看看這個網站:www.regular-expressions.info –

回答

6

嘗試刪除^和$:

Regex regex = new Regex(@"[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}", RegexOptions.None); 
  • ^:比賽必須在字符串的開頭開始或線。
  • $:匹配必須出現在字符串的末尾,或者在行或字符串的末尾的 處的\ n之前。

如果你想要的建議由邁克·斯特羅貝爾只匹配在單詞邊界,你可以使用\ B:

Regex regex = new Regex(@"\b[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}\b", RegexOptions.None); 
+0

也許用字邊界('\ b')代替它們? –

+0

@fcuesta,你明白了,但我認爲^是用指定的字符之一來啓動它。仍然不明白爲什麼我必須這樣做。 – mishap

+2

如果你想匹配asdf M4N 3M5 adsf而不是asdfM4N 3M5adsf「',那麼你需要在模式的兩端添加'\ b'。 –

2

我知道這個問題已經回答了,但我已經在你的模式發現兩招這我想強調:

  1. 沒有必要提及任何標記的單個實例。

    例如:(注意丟失的{1}

    \ d {1} = \ d

    [AZ] {1} = [AZ]

  2. 另外我不會推薦您在模式中使用'\ s'輸入<space>,因爲如果錯誤地按下退格鍵,您可能不會 找出錯誤,並且運行代碼將停止 的工作。

就個人而言,這種情況下,我會建議你使用\b,因爲它是最適合在這裏。