^([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/