Regex.Match()与子字符串不匹配

时间:2013-06-21 03:45:49

标签: c# regex

这很简单,但我无法弄明白。我想找到这个正则表达式的子字符串。它将是马赫“M4N 3M5”,但不符合以下内容:

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; 

2 个答案:

答案 0 :(得分:6)

尝试删除^和$:

Regex regex = new Regex(@"[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}", RegexOptions.None);
  • ^:匹配必须从字符串或行的开头开始。
  • $:匹配必须发生在字符串的末尾或者在\ n之前 行或字符串的结尾。

如果您只想在单词边界匹配,可以按照Mike Strobel的建议使用\ b:

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

答案 1 :(得分:2)

我知道这个问题已经得到解答,但我注意到你的模式中有两件事要强调:

  
      
  1. 无需提及任何令牌的单个实例。

         

    例如:(注意缺少的{1}

         

    \ d {1} = \ d

         

    [A-Z] {1} = [A-Z]

  2.   
  3. 另外,我建议您不要在模式使用中输入<space>&#39; \ s&#39;相反,因为如果错误地按下退格键,你可能不会   能够找出错误,运行代码将停止   工作

  4.   

就个人而言,我建议你使用\b,因为它最适合这里。