我有一个正则表达式,几乎可以完全满足我的要求: \.?(\w+[\s|,]{1,}\w+[\s|,]{1,}\w+){1}\.?
意思是它捕获连续3个单词的出现,除了空格和逗号(因此仅句子的一部分)外,其他单词之间没有任何分隔。但是我希望这与句子中3个单词的每个实例匹配。
因此,在这个超简单的示例中:
Hi this is Bob.
应该有2个捕获-“嗨,这是”和“这是鲍勃”。我似乎无法弄清楚如何使正则表达式引擎以这种方式解析整个语句。有什么想法吗?
您不仅可以在捕获组中获得重叠的文本,而且可以通过捕获组保存所需的子字符串来获得重叠的匹配项。
使用
(?=\b(\w+(?:[\s,]+\w+){2})\b)
无固定的正向超前测试会在字符串的每个位置测试空字符串是否匹配。它不消耗字符,但仍可以返回通过捕获组获得的子匹配项。
正则表达式细分:
\b
-单词边界(\w+(?:[\s,]+\w+){2})
-3个“单词”,以,
或空格分隔。
\w+
-1个或多个字母数字符号,后跟(?:[\s,]+\w+){2}
-2个序列,包含1个或多个空格或逗号,后跟1个或多个字母数字符号。该模式仅(...)
被放置在前行中的捕获组中(?=...)
。
单词边界在此表达式中很重要,因为它\b
可以防止单词内部(两个字母数字字符之间)匹配。由于前瞻未锚定,因此它会测试输入字符串中的所有位置,并\b
限制可以返回匹配项的位置。
在C#中,您只需要收集all match.Groups[1].Value
,例如:
var s = "Hi this is Bob.";
var results = Regex.Matches(s, @"(?=\b(\w+(?:[\s,]+\w+){2})\b)")
.Cast<Match>()
.Select(p => p.Groups[1].Value)
.ToList();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句