^([A-Z][A-Za-z.'\- ]+) ([A-Z][A-Za-z.'\-]+)$
对于 David Taylor,Gator 将捕获“David Taylor”作为第一场比赛,并将“Gator”作为第二场比赛。我不明白为什么正则表达式引擎会这样做。它不应该是贪婪的并仅使用第一组捕获整个3 字串:
^([A-Z][A-Za-z.'\- ]+)
或者它是否会进行一些回溯以产生匹配?
^([A-Z][A-Za-z.'\- ]+) ([A-Z][A-Za-z.'\-]+)$
对于 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)}
不允许有空格。
尝试这个。但这将需要一个只有 2 个名称的字符串...如果您想要前 2 个名称 - 然后$
从末尾删除。
^([A-Z][A-Za-z.'\-]+) ([A-Z][A-Za-z.'\-]+)$
第一个捕获组有一个空格,这导致它捕获前两个单词。