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

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

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

或者它是否会进行一些回溯以产生匹配?

4

2 回答 2

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

于 2013-09-11T15:36:25.907 回答
0

尝试这个。但这将需要一个只有 2 个名称的字符串...如果您想要前 2 个名称 - 然后$从末尾删除。

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

第一个捕获组有一个空格,这导致它捕获前两个单词。

于 2013-09-11T15:39:12.420 回答