regex - 为什么这个正则表达式同时捕获名字和中间名

标签 regex

^([A-Z][A-Za-z.'\- ]+) ([A-Z][A-Za-z.'\-]+)$

for David Taylor Gator 将捕获“David Taylor”作为第一场比赛,“Gator”作为第二场比赛。我不明白为什么正则表达式引擎会这样做。它不应该贪婪地只使用第一组捕获整个 3 字字符串吗:

^([A-Z][A-Za-z.'\- ]+)

或者它会做一些回溯以产生匹配吗?

最佳答案

值得一问的是,正则表达式的哪些部分是可选的,哪些必须逐字匹配。

^([A-Z][A-Za-z.'\- ]+) ([A-Z][A-Za-z.'\-]+)$
*                     *                    *

加星号的部分必须匹配。每个匹配项都必须包含行首、行尾和一个空格。现在考虑其他部分如何匹配,让我们将 [A-Z][A-Za-z.'\-] 称为名称字符。

^([A-Z][A-Za-z.'\- ]+) ([A-Z][A-Za-z.'\-]+)$
  -------------------   ------------------
          1                      2

1 可以匹配名称字符和空格的任何序列,只要其中至少有一个即可。 2 将匹配任何名称字符。从这个抽象层次来看,正则表达式是

{beginning of line}
{one or more (name characters or space)}
{space}
{one or more (name characters)}
{end of line}

这个正则表达式唯一可以匹配的方式

David Taylor Gator

{beginning of line}                      ^
{one or more (name characters or space)} "David Taylor"
{space}                                  " "
{one or more (name characters)}          "Gator"
{end of line}                            $

由于字符串中只有两个空格,可以考虑的另一件事是

{beginning of line}                      ^
{one or more (name characters or space)} "David"
{space}                                  " "
{one or more (name characters)}          "Taylor Gator"    XXX
{end of line}                            $

但这不匹配,因为“Taylor Gator”有一个空格,但是 {one or more (name characters)} 不允许有空格。

关于regex - 为什么这个正则表达式同时捕获名字和中间名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18745411/

相关文章:

PHP 正则表达式——找到不是 HTML 字符实体引用的符号

JavaScript Regex - 自定义字符和数字

regex - jSoup - 如何获取具有背景样式的元素(内联 CSS)?

python - 使用 RegEx 查找无序单词

.net - 以下正则表达式模式如何工作?

regex - 在 MySQL 中搜索 varchar 列的最快方法

java - 删除数字但不是单词的一部分

c# - 如何在 C# 中使用正则表达式解析 OData $filter?

python - 如何查找/替换独立单词或带有某些形容词的单词?

使用 OR 的正则表达式模式