捕获所有符合正则表达式的组

本文关键字:正则表达式 | 更新日期: 2023-09-27 18:22:23

我有一个正则表达式,它几乎完全符合我的要求:'.?('w+['s|,]{1,}'w+['s|,]{1,}'w+){1}'.?

这意味着它捕获了一行中3个单词的发生率,这些单词除了空格和逗号之外没有任何分隔符(因此仅为句子的一部分)。然而,我希望这能匹配一个句子中3个单词的每个实例。

在这个非常简单的例子中:

Hi this is Bob.

应该有两个捕获-"嗨,我是"answers"我是Bob"。我似乎不知道如何让regex引擎以这种方式解析整个语句。有什么想法吗?

捕获所有符合正则表达式的组

您不能只在捕获组中获得重叠的文本,但您可以通过捕获组获得重叠的匹配,捕获组包含您需要的子字符串。

使用

(?='b('w+(?:['s,]+'w+){2})'b)

查看regex演示

未固定的正向前瞻测试在字符串的每个位置都匹配一个空字符串。它不消耗字符,但仍然可以返回通过捕获组获得的子块。

Regex细分:

  • 'b-一个词的边界
  • ('w+(?:['s,]+'w+){2})-用,或空白分隔的3个"单词"。
    • 'w+-后面跟有一个或多个字母数字符号
    • (?:['s,]+'w+){2}-2个序列,包含1个或多个空格或逗号,后跟1个或更多字母数字符号

该模式刚好被放入被放置在前瞻CCD_ 9内部的捕获组CCD_。

单词边界在该表达式中很重要,因为'b防止在单词内部(两个字母数字字符之间)匹配。由于前瞻性未被锚定,它测试输入字符串内的所有位置,'b用作可以返回匹配的限制。

在C#中,您只需要收集所有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();

请参阅IDEONE演示