2013-12-09 14 views
5

は、私が最初になぜJavaの正規表現では、星の数量子がプラスの数量子より貪欲ですか?

<LogicalID>SupplyChain</Logical> 

からLogicalIDSupplyChainから抽出しようとしているテキストは、私は、次の正規表現を使用しています

["D", "SupplyChain"] 

を次のようにこれは

.*([A-Za-z]+)>([A-Za-z]+)<.* 

マッチ私は絶望的に、プラスの代わりにアスタリスクを使ってみました:

.*([A-Za-z]*)>([A-Za-z]+)<.* 

これは完全に一致しています。

ドキュメントでは、*は0回以上一致し、+は1回以上一致します。 +よりも*が欲しいのはなぜですか?

編集:これは以下のケースではないことが指摘されています。操作の順序は、最初の一致グループが実際にnullである理由を説明します。

+0

グレディエはどういう意味ですか? '。*'の場所を '。+'で変更しようとしましたか?それは貪欲ではなく、ここで重要なものを置く順序です。 – Pshemo

+0

それは貪欲のように思えました。実際は実行の順序です。私は@Airosの下の答えでこれを集めました。 – duber

+2

最初の正規表現で '?'の後ろに '?'を置くと、 '。*?([A-Za-z] +)>([A-Za-z] +)<。*' 。私は物事の仕方を見るのを助けるかもしれないからそれを指摘していますが、あなたの正確な要求に応じて、@ anubhavaの答えはおそらくもっと良いでしょう。 – ajb

答えて

5

それは貪欲に差はありません。あなたの最初の正規表現では:

.*([A-Za-z]+)>([A-Za-z]+)<.* 

あなたは>、その後、少なくとも手紙、その後、文字の任意の量(.*)を求めています。

.*([A-Za-z]*)>([A-Za-z]+)<.* 

そして、あなたは文字の任意の量に続いて、文字の任意の量をしたい:だから貪欲試合は*ではなく、2つ目ではD.

前に、すべてを消費するため、Dである必要があります>。したがって、最初の*はすべて>までを消費し、最初の取得グルー​​プは空の文字列に一致します。私はそれがまったく一致するとは思わない。

2

あなたは本当にこの正規表現を使用する必要があります。

<([A-Za-z]+)>([A-Za-z]+)< 

OR

<([A-Za-z]*)>([A-Za-z]+)< 

の両方がそれぞれLogicalIDSupplyChainと一致します。

PS:正規表現:.*([A-Za-z]*)>([A-Za-z]+)<は、最初の一致として空の文字列と一致しています。

ワーキングデモ:http://ideone.com/VMsb6n

+3

私はこれが質問に答えるとは思わない。 –

+0

@kocko:どうしていいのか詳しく教えてください。 – anubhava

+2

質問は「なぜ '*'はより欲しいのですか?」という疑問があります。私は、OPの正規表現 '。*([A-Za-z] *) '+'より? " –

1
Why is * greedier than +? 

これは貪欲を示していません。

最初の正規表現.*([A-Za-z]+)>([A-Za-z]+)<.*ここ

enter image description here

として表すことができるグループ1には、一致のための1つ以上の時間を提示する必要があるべきです。

と第二.*([A-Za-z]*)>([A-Za-z]+)<.*enter image description here

として

ここではグループ1は試合のためにゼロ以上の時間を提示する必要があるはずです。

関連する問題