我的正则表达式以量词*结尾。但我在一个字符串中有很少的匹配。我怎么能这样才能找到所有的比赛?我的正则表达式:
((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.
你可以使用积极的前瞻:
\w+
:
.*
?
\w+
后跟一个结肠:
或|
结束的刺痛(?= \w+:|$)
编写正则表达式时的一般规则是,当您想要查找模式的所有实例并将每个模式放入其自己的匹配中时,您可以为该模式编写正则表达式,而不是该模式量化*
次。否则,您将最终将整个字符串放入一个匹配项中。
我为你编辑了正则表达式:
CMD(?:1|2)(?::|;).*?(?=$|CMD)
开始几乎是不言自明的。接近尾声时,我将.
与懒惰的量词*?
相匹配。一旦字符串与前瞻匹配后,这将立即停止匹配。前瞻只是匹配另一个CMD
或字符串的结尾。
记得打开不区分大小写的选项!
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
。