144

RegEx (.NET バージョン) に最大の一致ではなく最小の有効な一致を取得するように指示するにはどうすればよいですか?

4

3 に答える 3

248

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

正規表現量指定子に関するドキュメントも役立つ場合があります。

于 2009-12-17T07:15:02.417 に答える
83

非貪欲な演算子?. そのようです:

.*?
于 2009-12-17T07:14:11.187 に答える
58

非貪欲な演算子は、可能な限り短い一致を意味するわけではありません。

abcabk

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

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

aこれは、 のすべての一致を引き続き許可する' ' の最後の可能な一致ですk

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

a[^a]+?k

const haystack = 'abcabkbk';
const paternNonGreedy = /a.+?k/;
const paternShortest = /a[^a]+?k/;

const matchesNonGreedy = haystack.match(paternNonGreedy);
const matchesShortest = haystack.match(paternShortest);

console.log('non greedy: ',matchesNonGreedy[0]);
console.log('shortest: ', matchesShortest[0]);

于 2014-01-31T11:22:07.753 に答える