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