3

给定以下字符串

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:当且仅当一起找到时,我希望它跳过。

我尝试了几种不同的方法,但仍然没有找到如何在 not 运算符中结合\d*两者s:

4

3 回答 3

4

您必须告诉正则表达式引擎:“在正则表达式的末尾,就在匹配之后,必须有一个(\\d*)(s:)或一个字符串结尾”。这可以使用前瞻来完成。

于 2012-01-03T11:46:57.893 回答
3

如果您想匹配任意数量的数字(不仅仅是 4),您可以使用以下代码:

var pattern = @".+?(?<!\d)((?=\d+s:)|$)";
var matches = Regex.Matches(input, pattern);

.+?是至少一个字符的非贪婪匹配。它必须是非贪婪的,否则.+将匹配整个字符串跳过任何出现的\d+s:.

(?<!\d)是一个否定的lookbehind,确保匹配的最后一个字符.不是数字。这是必需的,因为位数不固定为 4。如果不包括此后视,则输入 'X12' 可以匹配为any, digit, digitany, any, digit。您想避免第二次匹配,并且需要向后查找以确保1匹配 asdigit和 not any

((?=\d+s:)|$)是一个正向前瞻,可确保匹配以一些数字结尾,s:或者只是字符串 ( $) 的结尾。请注意,此先行是一个断言,它不包含在匹配中。它只是确保匹配之后是前瞻。

于 2012-01-03T14:13:25.910 回答
2

您可以按照@Ilya 的建议使用正则表达式积极前瞻,

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:)-> 从单词边界开始,匹配后缀但将其排除在捕获之外。后缀定义为'任意数量的空白字符,后跟长度为 0 到 4 的数字,然后是 s,然后是:.
一旦输入被拆分,然后清理输入以删除空条目。

于 2012-01-03T12:31:13.310 回答