正则表达式:很少与* Quantifier相匹配

时间:2017-12-24 11:07:12

标签: c# .net regex

我的正则表达式以量词*结尾。 但我在一个字符串中有很少的匹配。我怎么能这样才能找到所有的比赛?我的正则表达式:

((CMD1|CMD2)+(?::|;)+.*) 

测试字符串为"cmd1: test. test. test cmd2: test2. test2. test2" 所以我需要得到匹配:

cmd1: test. test. test
cmd2: test2. test2. test2

命令可以是随机词,如" Look"," Take"," Go"。在一个字符串中可能会出现任何命令。 例如:

Go: some sentences. and more. Take: other more sentences, and even more text here. Look: more and more. and more. 

3 个答案:

答案 0 :(得分:1)

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+:)");

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

答案 1 :(得分:1)

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

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

CMD(?:1|2)(?::|;).*?(?=$|CMD)

开头几乎是不言自明的。最后,我将.与懒惰的量词*?进行了匹配。一旦字符串与前瞻匹配后,这将立即停止匹配。前瞻只是匹配另一个CMD或字符串的结尾。

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

答案 2 :(得分:1)

你可以使用积极的前瞻:

\w+:.*?(?= \w+:|$)

  • 匹配单词字符一次或多次\w+
  • 匹配冒号:
  • 匹配任何字符零次或多次.*
  • 让它非贪婪?
  • 一个积极的前瞻,它会将单词字符置为\w+一次或多次后跟冒号:|结尾(?= \w+:|$)

Demo