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

问题描述 投票:1回答:3

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

((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. 
c# .net regex
3个回答
1
投票

你可以使用积极的前瞻:

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

  • 匹配单词字符一次或多次\w+
  • 匹配冒号:
  • 匹配任何字符零次或多次.*
  • 让它非贪婪的?
  • 一个积极的前瞻,一个或多次声明一个单词字符\w+后跟一个结肠:|结束的刺痛(?= \w+:|$)

Demo


1
投票

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

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

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

开始几乎是不言自明的。接近尾声时,我将.与懒惰的量词*?相匹配。一旦字符串与前瞻匹配后,这将立即停止匹配。前瞻只是匹配另一个CMD或字符串的结尾。

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


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

© www.soinside.com 2019 - 2024. All rights reserved.