给出以下字符串
1080s: 33, 6'2" meg: test. 1748s: I THINK IM GONNA <span class="highlight" >PICK</span> 1749s: TWO COMPLETE OPPOSITES.
我想对它进行正则表达式操作,并希望以下匹配
1st match : 1080s: 33, 6'2" meg: test.
2nd match : 1748s: I THINK IM GONNA <span class="highlight" >PICK</span>
3rd match : 1749s: TWO COMPLETE OPPOSITES.
我在ASP.NET中使用以下正则表达式来执行匹配
MatchCollection mcs = Regex.Matches(txtData, "(\\d*)(s:)([^(\\d*)](s:){0})*");
正则表达式将匹配,但捕获不正确。一旦找到\d*
或s:
,正则表达式就会跳过该文本。我希望它跳过当且仅当\d*s:
一起找到时才跳过。
我尝试了几种不同的方式,但仍未找到如何将\d*
和s:
组合在一个not运算符中。
答案 0 :(得分:4)
你必须告诉正则表达式引擎:“在正则表达式的最后,在匹配之后,必须有一个(\\d*)(s:)
或一个字符串结尾”。这可以使用前瞻来完成。
答案 1 :(得分:3)
如果您想匹配任意数量的数字(不仅仅是4位数),您可以使用以下代码进行匹配:
var pattern = @".+?(?<!\d)((?=\d+s:)|$)";
var matches = Regex.Matches(input, pattern);
.+?
是至少一个字符的非贪婪匹配。它必须是非贪婪的,否则.+
将匹配整个字符串跳过\d+s:
的任何事件。
(?<!\d)
是负面反对,可确保.
匹配的最后一个字符不是数字。这是必需的,因为数字的位数不固定为4.如果不包括此后观,则输入“X12”可以匹配为any, digit, digit
或any, any, digit
。您希望避免第二次匹配并需要lookbehind以确保1
与digit
匹配,而不是any
。
((?=\d+s:)|$)
是正向前瞻,可确保匹配以某些数字后跟s:
结尾,或者只是字符串的结尾({{1} })。请注意,此前瞻是一个断言,它不包含在匹配中。它只是确保匹配后跟前瞻。
答案 2 :(得分:2)
您可以按照@Ilya的建议使用regex positive lookahead,
var pattern = @"\b(?=\s*\d{0,4}s:)";
var lines = new Regex(pattern).Split(input).Where(
s =>
string.IsNullOrEmpty(s.Trim()) == false).ToArray();
<强>解释强>
\b(?=\s*\d{0,4}s:)
- &gt;从单词边界开始,匹配后缀但将其从捕获中排除。后缀定义为“任意数量的空格字符,后跟长度为0到4的数字,后跟s,然后是:
。
输入分割后,清除输入以删除空条目。