我试图了解 Regex 中的非捕获组。
如果我有以下输入:
He hit the ball. Then he ran. The crowd was cheering! How did he feel? I felt so energized!
如果我想提取每个句子中的第一个单词,我试图使用匹配模式:
^(\w+\b.*?)|[\.!\?]\s+(\w+)
这会将所需的输出放在子匹配中。
Match $1
He He
. Then Then
. The The
! How How
? I I
但我在想,使用非捕获组,我应该能够让他们回到比赛中。
我试过:
^(?:\w+\b.*?)|(?:[\.!\?]\s+)(\w+)
这产生了:
Match $1
He
. Then Then
. The The
! How How
? I I
和
^(?:\w+\b.*?)|(?:[.!\?]\s+)\w+
产生:
Match
He
. Then
. The
! How
? I
我错过了什么?
(我正在使用 RegExLib.com 测试我的正则表达式,但随后会将其传输到 VBA)。
最佳答案
一个针对字符串“foo”的简单示例:
(f)(o+)
将产生
$1
= 'f' 和 $2
= '哦';(?:f)(o+)
在这里,
$1
= 'oo' 因为您已明确表示不捕获第一个匹配组。并且没有第二个匹配组。对于您的场景,这感觉是正确的:
(?:(\w+).*?[\.\?!] {2}?)
请注意,最外面的组是非捕获组,而内部组(句子的第一个单词)是捕获。
关于带有非捕获组的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14244437/