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

标签 regex

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

相关文章:

regex - Bash 正则表达式在句子中查找特定单词

javascript - 正则表达式相关的混淆

javascript - Lua 模式匹配中 ".-"的 RegEx 等价物是什么?

regex - 点元字符如何匹配换行符?

c# - 在字符串正则表达式 C# 中查找一个单词,然后查找一个值编号

Java 正则表达式问题?

在 C 中编译/匹配 POSIX 正则表达式

javascript - 使用 jquery 验证插件,如何在文本框上添加正则表达式验证?

java - 使用正则表达式检查文件扩展名

Java正则表达式替换全部