0

这很简单,但我无法弄清楚。我想用这个正则表达式找到一个子字符串。它将匹配“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; 
4

2 回答 2

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);
于 2013-06-21T03:53:30.133 回答
2

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

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

    例如:(注意缺少{1}

    \d{1} = \d

    [AZ]{1} = [AZ]

  2. 此外,我不建议您<space>在模式中使用 '\s' 输入 a,因为如果错误地按下了退格键,您可能无法找出错误并且正在运行的代码将停止工作。

就个人而言,对于这种情况,我建议您使用\b,因为它最适合这里。

于 2013-06-21T05:26:31.477 回答