正则表达式中不是运算符

时间:2012-01-03 11:40:28

标签: asp.net regex not-operator

给出以下字符串

1080s: 33, 6&apos;2&quot; meg: test. 1748s: I THINK IM GONNA <span class="highlight" >PICK</span> 1749s: TWO COMPLETE OPPOSITES.

我想对它进行正则表达式操作,并希望以下匹配

1st match : 1080s: 33, 6&apos;2&quot; 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运算符中。

3 个答案:

答案 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, digitany, any, digit。您希望避免第二次匹配并需要lookbehind以确保1digit匹配,而不是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,然后是:
输入分割后,清除输入以删除空条目。