捕获所有符合正则表达式的组
本文关键字:正则表达式 | 更新日期: 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演示