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

for David Taylor Gator は、「David Taylor」を最初の一致としてキャプチャし、「Gator」を 2 番目の一致としてキャプチャします。正規表現エンジンがこれを行う理由がわかりません。貪欲で、最初のグループだけを使用して 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これらの少なくとも 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}                            $

文字列には 2 つのスペースしかないため、他に考えられることは次のとおりです。

{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.'\-]+)$

最初のキャプチャ グループにはスペースがあったため、最初の 2 つの単語がキャプチャされました。

于 2013-09-11T15:39:12.420 に答える