正規表現の場合、検索までの構文は何ですか? ちょっと好き:
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
正規表現の場合、検索までの構文は何ですか? ちょっと好き:
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
「まで検索する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
(注:交替から確実に分離するために、非キャプチャグループを追加しました)
先読み正規表現構文は、目標を達成するのに役立ちます。したがって、あなたの例の正規表現は
.*?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
これを試して
(.*?quick.*?)z