たとえば、この正規表現
(.*)<FooBar>
一致します:
abcde<FooBar>
しかし、どうすれば複数の行で一致させることができますか?
abcde
fghij<FooBar>
これを試して:
((.|\n)*)<FooBar>
基本的には「任意の文字または改行」が0回以上繰り返されることを意味します。
言語によって異なりますが、正規表現パターンに追加できる修飾子が必要です。PHPでは次のようになります。
/(.*)<FooBar>/s
末尾のsにより、ドットは改行を含むすべての文字と一致します。
Eclipse 検索を使用している場合は、「DOTALL」オプションを有効にして「.」を作成できます。行区切り文字を含む任意の文字に一致します。検索文字列の先頭に「(?s)」を追加するだけです。例:
(?s).*<FooBar>
多くの正規表現方言で/[\S\s]*<Foobar>/
は、あなたが望むことだけを行います。ソース
([\s\S]*)<FooBar>
ドットは改行(\ r \ n)を除くすべてに一致します。したがって、すべての文字に一致する\ s\Sを使用します。
"."
通常、改行とは一致しません。S
ほとんどの正規表現エンジンでは、 -flag(およびとも呼ばれDOTALL
ます)を追加して、改行にも一致SINGLELINE
させることができます。"."
それが失敗した場合は、のようなことを行うことができます[\S\s]
。
Eclipse の場合、次の式が機能しました。
フー
じゃだじゃだバー」
正規表現:
Foo[\S\s]{1,10}.*Bar*
使用する:
/(.*)<FooBar>/s
s
ドット(。)がキャリッジリターンと一致する原因。
(.|\n)*
(たとえば)[\s\S]*
(言語の正規表現がそのようなエスケープをサポートしている場合)よりも効率が悪い可能性があることに注意してください。改行にも一致します。または、 のような POSIXy の代替手段を使用することもできます[[:space:][:^space:]]*
。
RegexOptions.Singleline を使用します。.
改行を含めると意味が変わります。
Regex.Replace(content, searchText, replaceText, RegexOptions.Singleline);
Java ベースの正規表現では、[\s\S]
.
通常、.
改行と一致しないので、試してください((.|\n)*)<foobar>
。
言語内での使用のコンテキストでは、正規表現は行ではなく文字列に作用します。したがって、入力文字列に複数の行があると仮定すると、正規表現を通常どおりに使用できるはずです。
この場合、「<FooBar>」が存在するため、指定された正規表現は文字列全体と一致します。正規表現の実装の詳細に応じて、$ 1の値(「(。*)」から取得)は「fghij」または「abcde\nfghij」のいずれかになります。他の人が言っているように、いくつかの実装では、「。」かどうかを制御できます。改行と一致し、選択肢があります。
行ベースの正規表現の使用は、通常、egrepなどのコマンドラインで使用されます。
JavaScript では、[^]* を使用して、改行を含むゼロから無限の文字を検索できます。
$("#find_and_replace").click(function() {
var text = $("#textarea").val();
search_term = new RegExp("[^]*<Foobar>", "gi");;
replace_term = "Replacement term";
var new_text = text.replace(search_term, replace_term);
$("#textarea").val(new_text);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="find_and_replace">Find and replace</button>
<br>
<textarea ID="textarea">abcde
fghij<Foobar></textarea>
私は同じ問題を抱えていて、おそらく最善の方法ではない方法で解決しましたが、うまくいきます。実際の試合を行う前に、すべての改行を置き換えました。
mystring = Regex.Replace(mystring, "\r\n", "")
私は HTML を操作しているので、この場合、改行はあまり重要ではありません。
上記のすべての提案を試してみましたが、うまくいきませんでした。私は.NET 3.5 FYIを使用しています。
Java の特定のifブロックに一致させたい:
...
...
if(isTrue){
doAction();
}
...
...
}
正規表現を使用する場合
if \(isTrue(.|\n)*}
メソッドブロックの閉じ中括弧が含まれていたので、使用しました
if \(!isTrue([^}.]|\n)*}
ワイルドカードの一致から閉じ括弧を除外します。
多くの場合、部分文字列の前の行にまたがるいくつかのキーワードで部分文字列を変更する必要があります。XML 要素を考えてみましょう:
<TASK>
<UID>21</UID>
<Name>Architectural design</Name>
<PercentComplete>81</PercentComplete>
</TASK>
81 を別の値、たとえば 40 に変更したいとします。最初に を識別し、次にuntil.UID.21..UID.
を含むすべての文字をスキップします。正規表現パターンと置換指定は次のとおりです。\n
.PercentCompleted.
String hw = new String("<TASK>\n <UID>21</UID>\n <Name>Architectural design</Name>\n <PercentComplete>81</PercentComplete>\n</TASK>");
String pattern = new String ("(<UID>21</UID>)((.|\n)*?)(<PercentComplete>)(\\d+)(</PercentComplete>)");
String replaceSpec = new String ("$1$2$440$6");
// Note that the group (<PercentComplete>) is $4 and the group ((.|\n)*?) is $2.
String iw = hw.replaceFirst(pattern, replaceSpec);
System.out.println(iw);
<TASK>
<UID>21</UID>
<Name>Architectural design</Name>
<PercentComplete>40</PercentComplete>
</TASK>
サブグループ(.|\n)
はおそらく欠落しているグループ$3
です。それまでに非キャプチャにすると (?:.|\n)
、. したがって、パターン とは次のようにもなります。$3
(<PercentComplete>)
replaceSpec
pattern = new String("(<UID>21</UID>)((?:.|\n)*?)(<PercentComplete>)(\\d+)(</PercentComplete>)");
replaceSpec = new String("$1$2$340$5")
交換は以前と同じように正しく機能します。