正規表現の場合、検索までの構文は何ですか?ちょっと好き:
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)で機能するとは限りません。
代替ソリューション:
多くの場合、遅延数量詞を使用する、より単純で読みやすいソリューションを使用することもできます。数量詞に?
を追加することにより*
、現在の位置からできるだけ少ない文字に一致しようとします。
.*?(?=(?:X)|$)
任意の数の文字に一致し、直前X
(任意の正規表現)または文字列の終わり(X
一致しない場合)で停止します。これを機能させるには、「ドットがすべてに一致する」オプションを設定する必要がある場合もあります。(注:X
交代から確実に分離するために、キャプチャしないグループを追加しました)
(?:...)
捕獲していないグループのせいですか?それは動作し((?!X).)*
ますか?
grep
、SQLのmysql bintransformetからの1つのデータベースのみに対する要求をフィルタリングするために使用していました。ここに獣があります:grep -Po "(?s)use database_to_keep(.*?)(?=^use)" mysql-bin.000045.sql > filtered.sql
Up
キーを押したとき、最後のコマンドは私が使用したコマンドではないため、bashの競合のように見えます:grep -Po "(?s)use database_to_keep(.*?)(?:(?!^use).)*" mysql-bin.000045.sql > filtered.sql
$
の代替を:置き換える.*?(?=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
grep
が、この答えは機能します。