正規表現プラスと星の違い?


90

違いは何ですか:

(.+?)

そして

(.*?)

PHPpreg_match正規表現で使用する場合はどうなりますか?

回答:


150

それらは数量詞と呼ばれます。

* 上記の式が0個以上

+ 上記の式の1つ以上

デフォルトでは、量指定子は貪欲です。つまり、可能な限り多くの文字に一致します。

?数量詞は、この数量詞は「ungreedy」にするために動作を変更した後、それができるだけ一致することを意味します。

貪欲/貪欲でない例

たとえば、文字列「abab

a.*b 「abab」と一致します(preg_match_allは1つの一致、「abab」を返します)

whilea.*?bは、最初の「ab」のみに一致します(preg_match_allは2つの一致、「ab」を返します)

正規表現はオンラインでテストできます。たとえば、Regexrでテストできます。ここで貪欲な例を参照してください。


2
「怠惰」は「貪欲」のより一般的な用語です
Walter

例は正しくありません。どちら(.+?)(.*?)されている正規表現の様々な位置で異なる動作をしa(.+?)(.+?)ba(.+?)ba(.*?)(.*?)ba(.*?)b
Louis 5518年

a。* bが「ab」を返さないのはなぜですか?「aとbの間に0文字以上ある単語」と言っているのではないので、abの間にゼロ文字があり、一致する可能性があります。なぜこれが間違っているのですか?
Hello World

@HelloWorld、これは私が上で説明した貪欲と関係があります。.*可能な限り一致します。できるだけ早く停止したい場合は、貪欲にしないでください.*?
ステマ

22

最初の(+)は1つ以上の文字です。2番目の(*)は0文字以上です。どちらも欲張りではなく(?)、何にでも一致します(.)。


1
これは、s修飾子が設定されているかどうかによって異なります。
クエンティン

8

Aは、前のパターンの1つ以上のインスタンスに+一致します。Aは、前のパターンの0個以上のインスタンスに一致します*

したがって、基本的に、+パターンのインスタンスが少なくとも1つ存在する必要があります。使用する*場合、インスタンスがない場合でも一致します。


8

+ 少なくとも1つの文字に一致します

* 任意の数(0を含む)の文字に一致します

?怠惰な発現を示すので、できるだけ少ない文字と一致します。


8

以下が一致する文字列であると考えてください。

ab

パターン(ab.*)は、キャプチャグループの一致を返します。ab

パターン(ab.+)は一致せず、何も返しませんが。

ただし、文字列を次のように変更するとaba、パターンに戻ります(ab.+)

aba

これは、特に+ vs *
Terrence

6

+は最小のものであり、*ゼロにすることもできます。


"+ is minimal one"この文はどういう意味ですか?
デット

5

正規表現では、{i,f}「間の意味ifマッチします」。次の例を見てみましょう。

  • {3,7} 3〜7試合を意味します
  • {,10} 下限なしで最大10試合を意味します(つまり、下限は0です)
  • {3,} 上限のない少なくとも3つの一致を意味します(つまり、上限は無限です)
  • {,} 一致数の上限または下限がないことを意味します(つまり、下限は0で、上限は無限です)。
  • {5} 正確に4を意味します

ほとんどの優れた言語には略語が含まれているため、正規表現にも略語が含まれています。

  • + の省略形です {1,}
  • * の省略形です {,}
  • ? の省略形です {,1}

つまり+、少なくとも1つの一致が必要ですが、*任意の数の一致を受け入れるか、まったく一致しないことを意味します。?せず、1つ以下の一致または0受け入れます。

クレジット:Codecademy.com


4

星はプラスに非常に似ていますが、唯一の違いは、プラスが前の文字/グループの1つ以上に一致するのに対し、スターは0以上に一致することです。


2

前の答えは簡単な例を強調していないと思います:

たとえば、配列があります。

numbers = [5, 15]

次の正規表現が^[0-9]+一致します:15のみ。ただし、^[0-9]*両方に一致し5 and 15ます。違いは、+演算子が先行する正規表現の少なくとも1つの複製を必要とすることです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.