为什么这个正则表达式同时捕获第一个和中间名

时间:2013-09-11 15:32:32

标签: regex

^([A-Z][A-Za-z.'\- ]+) ([A-Z][A-Za-z.'\-]+)$
对于大卫·泰勒来说,Gator将把“David Taylor”作为第一场比赛,将“Gator”作为第二场比赛。我不明白为什么正则表达式引擎正在这样做。不应该贪婪并只使用第一组捕获整个 3字符串:

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

还是会进行一些反向跟踪以产生匹配?

2 个答案:

答案 0 :(得分:2)

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

^([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)}不允许空格。

答案 1 :(得分:0)

试试这个。但它需要一个只有2个名字的字符串...如果你想要前2个名字 - 那么从最后删除$

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

第一个捕获组有一个空间,这使得它捕获前两个单词。