带有非捕获组的正则表达式

Mon*_*eGA 4 regex

我试图了解 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)。

Mad*_*aks 6

一个针对字符串“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)

请注意,最外面的组是非捕获组,而内部组(句子的第一个单词)是捕获。

  • 结果相同,*但您没有创建任何不必要的匹配组*。`(?:)` 语法的意思是“分组,但不创建反向引用”。如果省略它,您将创建一个不需要的反向引用。很高兴我能提供帮助,如果您能够考虑投票我的答案(以及您认为也有帮助的其他答案)。干杯 (2认同)