94

正規表現の場合、検索までの構文は何ですか? ちょっと好き:

Haystack:
The quick red fox jumped over the lazy brown dog

Expression:
.*?quick -> and then everything until it hits the letter "z" but do not include z
4

3 に答える 3

186

「まで検索するXが含まない」という明示的な方法Xは次のとおりです。

(?:(?!X).)*

X任意の正規表現を指定できます。

ただし、あなたの場合、これはやり過ぎかもしれません-ここで最も簡単な方法は

[^z]*

これは以外zのすべてに一致するため、次の の直前で停止しますz

一致.*?quick[^z]*しますThe quick fox jumps over the la

ただし、注意すべき単純な文字が複数あるとすぐに(?:(?!X).)*、たとえば次のようになります。

(?:(?!lazy).)*- 単語の先頭までのすべてに一致しますlazy

これは、先読みアサーション、より具体的には否定先読みを使用しています。

.*?quick(?:(?!lazy).)*一致しThe quick fox jumps over theます。

説明:

(?:        # Match the following but do not capture it:
 (?!lazy)  # (first assert that it's not possible to match "lazy" here
 .         # then match any character
)*         # end of group, zero or more repetitions.

さらに、キーワードを検索するとき、それらを単語境界アンカーで囲みたい場合があります:\bfox\bは完全な単語のみに一致しfox、 のキツネには一致しませんfoxy

ノート

一致させるテキストに改行も含めることができる場合は、正規表現エンジンの「ドットがすべて一致」オプションを設定する必要があります。通常、これは正規表現の先頭に追加することで実現できますが(?s)、すべての正規表現エンジン (特に JavaScript) で機能するとは限りません。

代替ソリューション:

多くの場合、遅延量指定子を使用する、より単純で読みやすいソリューションを使用することもできます。?量指定子に aを追加する*ことで、現在の位置からできるだけ少ない文字に一致しようとします。

.*?(?=(?:X)|$)

任意の数の文字に一致し、文字列の直前X(任意の正規表現である可能性があります) または文字列の末尾 (X一致しない場合) で停止します。これを機能させるには、「ドットがすべて一致」オプションを設定する必要がある場合もあります。X(注:交替から確実に分離するために、非キャプチャグループを追加しました)

于 2010-10-03T14:12:24.613 に答える
19

先読み正規表現構文は、目標を達成するのに役立ちます。したがって、あなたの例の正規表現は

.*?quick.*?(?=z)

そして、先読みの.*?前の遅延マッチングに注意することが重要です。式は、文字が最初に出現するまで部分文字列と一致します。(?=z)z

C# コード サンプルは次のとおりです。

const string text = "The quick red fox jumped over the lazy brown dogz";

string lazy = new Regex(".*?quick.*?(?=z)").Match(text).Value;
Console.WriteLine(lazy); // The quick red fox jumped over the la

string greedy = new Regex(".*?quick.*(?=z)").Match(text).Value;
Console.WriteLine(greedy); // The quick red fox jumped over the lazy brown dog
于 2014-04-22T04:59:23.233 に答える
0

これを試して

(.*?quick.*?)z
于 2010-10-03T14:13:19.480 に答える