C# 正则表达式:与*量词很少匹配

C# 正则表达式:与*量词很少匹配,c#,.net,regex,C#,.net,Regex,我的正则表达式以量词*结尾。 但我有几个匹配的字符串。我怎样才能使它仍然找到所有匹配项?我的正则表达式: ((CMD1|CMD2)+(?::|;)+.*) 测试字符串是“cmd1:test.test.test cmd2:test2.test2.test2” 所以我需要找到匹配项: cmd1: test. test. test cmd2: test2. test2. test2 命令可以是像“看”、“拿”、“走”这样的随机词。一个字符串中可能有n个任意命令。 例如: 您可以删除\s+,但在这

我的正则表达式以量词*结尾。 但我有几个匹配的字符串。我怎样才能使它仍然找到所有匹配项?我的正则表达式:

((CMD1|CMD2)+(?::|;)+.*) 
测试字符串是
“cmd1:test.test.test cmd2:test2.test2.test2”
所以我需要找到匹配项:

cmd1: test. test. test
cmd2: test2. test2. test2
命令可以是像“看”、“拿”、“走”这样的随机词。一个字符串中可能有n个任意命令。 例如:


您可以删除
\s+
,但在这种情况下,您应该对结果字符串调用
Trim

编写正则表达式时的一般规则是,当您希望找到一个模式的所有匹配项并将每个模式放入其自己的匹配项时,您为该模式编写正则表达式,而不是将该模式量化为
*
次。否则,您将最终将整个字符串放入一个匹配中

我为您编辑了正则表达式:

CMD(?:1|2)(?::|;).*?(?=$|CMD)
开头几乎是不言自明的。最后,我用惰性量词
*?
匹配了
。这将在字符串与前瞻匹配后立即停止匹配。向前看只匹配另一个
CMD
或字符串的结尾


记住打开不区分大小写选项

您可以使用积极的前瞻:

  • 将单词字符匹配一次或多次
    \w+
  • 匹配冒号
  • 将任何字符零次或多次匹配
    *
  • 使其非贪婪
  • 一种正向前瞻,它将一个单词字符断言一次或多次
    \w+
    ,后跟冒号
    |
    (?=\w+:|$)

可能有n个匹配的命令,并且命令可能不同。我认为您可以使用
Regex.Split(s,@“(?!^)\s*(?=CMD\d+[:;]),RegexOptions.IgnoreCase)
。如果您的
CMD
是占位符,请对命令名使用交替选项,
(?=CMD\d+[:;])
=>
(?=(?:CMD1 | CMD2 | CMDn)[:;])
。如果命令总是用空格分隔,请将
(?!^)\s*
替换为
\s+
。它只提供第一个匹配项。我可以这样做:从字符串中删除匹配项,直到字符串没有任何匹配项为止。但这是一个解决办法。使用
Regex.Matches
而不是
Regex.Match
。前者返回一个
匹配集合
。谢谢。这就是我要找的。对于我的例子,我修改了正则表达式:(Go | Take | Look):.*?(?=\w+:|$)
string s = "Go: some sentences. and more. Take: other more sentences, and even more text here. Look: more and more. and more.";
var matches = Regex.Matches(s, @"(?i)(go|take|look):.+?(?=\s+\w+:)");
CMD(?:1|2)(?::|;).*?(?=$|CMD)