RegEx:可能な限り最小の一致または貪欲でない一致


回答:


192

.*orのような正規表現の場合.+、疑問符(.*?または.+?)を追加して、できるだけ少ない文字と一致させます。オプションでセクション(?:blah)?を照合するが、どうしても必要な場合を除いて照合しない場合は、などを使用します(?:blah){0,1}?。繰り返し一致(使用{n,}または{n,m}構文のいずれか)の場合、疑問符を追加して、できるだけ一致しないようにします(例:{3,}?または{5,7}?)。

正規表現の数量詞に関するドキュメントも役立ちます。


7
私がこの誤解している唯一の人物かどうかはわかりませんが、注意することが重要です。貪欲でない演算子は可能な限り少ない数の文字に一致することは事実ですが、それでもまだ一致しているとは限りませんために。「できるだけ少ない文字」は、RegEx標準に関する「最短一致」とは異なります。私のコメントの下の回答を参照してください:とを使用するabcabka.+?k、RegExは文字列全体と一致します。
ファインフット

Line2「絶対に必要な場合を除いて、一致なし」:これはどういう意味ですか?


45

非貪欲演算子は、可能な最短の一致を意味するものではありません。

アバブ

a.+?k 最後の3つの記号だけではなく、文字列全体(この例では)と一致します。

代わりに、可能な限り最小の一致を実際に見つけたいと思います。

つまり、 ' a'の最後の一致は、のすべての一致を許可しkます。

これを行う唯一の方法は、次のような式を利用することだと思います。

a[^a]+?k


2
または、一致がネストされている場合、最後から開始して逆の順序で検索します: "(ab(abk)bk)"。
LBogaardt

7
@LBogaardtどのように逆順で検索しますか?
わかり

2
@LBogaardtまだ未解決の質問:逆順に検索するにはどうすればよいですか?取得したいとしましょうcab。私の入力がでcaaacabあり、a.*?bそれを検索すると、内部の短い一致ではなく完全な文字列が返されます。どのようにして後方から検索しbますか?
C4d 2017

3
文字列を逆にして、正規表現を適用します。
ジョナサンアレン

3
これはとても役に立ちます。ここで何が起こっているのかを理解しようとしている私のような人々にとって、一般的な形式は次のSTART[^START]*?ENDとおりです(STARTとENDは開始文字と終了文字の正規表現です)。これは基本的に、「中間の文字に再度STARTが含まれないSTARTからENDまでのすべてに一致する」という意味です
derekantrican
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.