1

このチュートリアルから、「正規表現 - 量指定子」について学び、このチュートリアルで使用されるこのテスト コードに基づいています。

これらのテストについて質問があります。

Enter your regex: ab*foo
Enter input string to search: xabfooxxxabbbfoox
I found the text "abfoo" starting at index 1 and ending at index 6.
I found the text "abbbfoo" starting at index 9 and ending at index 16.

しかし

Enter your regex: a.*foo
Enter input string to search: xabfooxxxabbbfoox
I found the text "abfooxxxabbbfoo" starting at index 1 and ending at index 16.

これらではない理由:

I found the text "abfoo" starting at index 1 and ending at index 6.
I found the text "abbbfoo" starting at index 9 and ending at index 16.

一般的に、私はいつも.*または.+使用されていることに気付きました:

  • 一致する場合は 1 つだけです。

  • 文字列の一致するセクションは常に最長のものです。

では、それぞれのマッチングはどのように機能するのでしょうか?

4

6 に答える 6

3

ab*fooに一致しa、その後に 0 個以上bの s が続き、その後にfoo

a.*fooに一致しa、その後に 0 個以上の任意の文字 ( で表される.) が続き、その後にfoo

b+文字の 1 つ以上のインスタンスに一致しますb

パターンが何を意味するかを説明する優れた正規表現テスト ツールについては、regex101を確認してください。

于 2013-01-07T22:37:39.233 に答える
2

2番目の正規表現で*は、貪欲な量指定子であるという問題があります。どういう意味ですか?つまり、そのfoo文字列が最後に出現するまで停止しません。

量指定子の後に追加するだけで貪欲でないようにすることができます。これにより?、正規表現に可能な限り一致しないように指示され、必要なものに一致します。

結局:

最初のものはb、0 であっても、可能な限り多く一致し.ます。

于 2013-01-07T22:40:01.790 に答える
1

*前の文字の 0 個以上に貪欲に一致します。 .任意の文字に一致します。つまり.*、「0 個以上の任意の文字に一致する」という意味です。

肝心なのは「貪欲」の部分です。 a.*fooは文字列の最後まで検索を続け、最後に出現する を探しfooます。見つかったら、「バックアップ」して、一致を完了としてマークします。したがって、 がある場合axxxxfooxxxfooxxx、貪欲なマッチング動作は中間の に一致し、fooそれらを他の文字と同様に扱いますが、最後の文字で停止します。

于 2013-01-07T22:36:57.333 に答える
0

.* または .+ は、デフォルトでほとんどの正規表現プログラムが可能な限り長い部分文字列と一致するように設定されているため、一致するものがあれば 1 つ生成します。

ただし、一部はオプションで構成できる場合があります。

于 2013-01-07T22:40:58.260 に答える
0

acfooは一致しますが、一致a.*fooしませんab.*foo

于 2013-01-07T22:36:52.540 に答える
0

ab*foo

a の後に 0 個以上の b と foo が続く場合に一致します。例:

afoo
abfoo
abbfoo
abbbfoo
abbbbbbbbbbbbbbbbbbbbfoo

a.*foo

a の後に何かが続き、その後に foo が続くものに一致します

afoo
abfoo
acfoo
adfoo
asdfoo
asdasdfasdfawqfefoo
于 2013-01-07T22:48:02.710 に答える