^([A-Z][A-Za-z.'\- ]+) ([A-Z][A-Za-z.'\-]+)$
对于大卫·泰勒来说,Gator将把“David Taylor”作为第一场比赛,将“Gator”作为第二场比赛。我不明白为什么正则表达式引擎正在这样做。不应该贪婪并只使用第一组捕获整个 3字符串:
^([A-Z][A-Za-z.'\- ]+)
还是会进行一些反向跟踪以产生匹配?
答案 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.'\-]+)$
第一个捕获组有一个空间,这使得它捕获前两个单词。