たとえば、この正規表現
(.*)<FooBar>
一致します:
abcde<FooBar>
しかし、どうすればそれを複数の行にまたがって一致させることができますか?
abcde
fghij<FooBar>
これは言語に依存しますが、正規表現パターンに追加できる修飾子があるはずです。 PHPでは、
/(.*)<FooBar>/s
最後のsは、ドットを改行を含めてallに一致させます。
これを試して:
((.|\n)*)<FooBar>
それは基本的に「任意の文字または改行」が0回以上繰り返されたと言います。
Eclipse検索を使用している場合は、「DOTALL」オプションを有効にして「。」を作成できます。行区切り文字を含む任意の文字に一致します。検索文字列の先頭に「(?s)」を追加するだけです。例:
(?s).*<FooBar>
JavaScriptでは、/[\S\s]*<Foobar>/
を使用してください。 出典
([\s\S]*)<FooBar>
ドットは改行(\ r\n)以外のすべてにマッチします。そのため、すべての文字に一致する\ s\Sを使用してください。
私達はまた使用してもいいです
(.*?\n)*?
欲張らずに改行を含むすべてのものに一致させる
これは新しい行をオプションにします
(.*?|\n)*?
"."
は通常、改行と一致しません。ほとんどの正規表現エンジンでは、"."
を改行にも一致させるためにS
-フラグ(DOTALL
およびSINGLELINE
とも呼ばれる)を追加できます。それでもうまくいかない場合は、[\S\s]
のようにすることができます。
Eclipseの場合、次の式で動作しました。
フー
ジャダジャダバー」
正規表現:
Foo[\S\s]{1,10}.*Bar*
/(.*)<FooBar>/s
sを指定すると、ドット(。)はキャリッジリターンと一致します。
Javaベースの正規表現では[\s\S]
を使うことができます
RegexOptions.Singlelineを使用すると、の意味が変わります。改行を含める
Regex.Replace(content、searchText、replaceText、RegexOptions.Singleline);
(.|\n)*
は(例えば)[\s\S]*
(あなたの言語の正規表現がそのようなエスケープをサポートしている場合)よりも効率が悪くなることがあることに注意してください。改行にもマッチします。あるいは、[[:space:][:^space:]]*
のようなPOSIXyの選択肢を使うこともできます。
パターン修飾子sUを使用すると、PHPで目的のマッチングが得られます。
preg_match('/(.*)/sU',$content,$match);
http://dreamluverz.com/developers-tools/regex-match-all-including-new-linehttp://php.net/manual/en/reference.pcre.pattern.modifiers.php
私は同じ問題を抱えていて、おそらく最善の方法ではないがそれを解決したが、それはうまくいく。本当の試合をする前に、すべての改行を置き換えました。
mystring= Regex.Replace(mystring, "\r\n", "")
私はHTMLを操作しているので、この場合改行は私には関係ありません。
私は上の提案をすべて試してみましたが、私は.Net 3.5を使用しています。
Javascriptでは、[^] *を使用して、改行を含めて0〜無限の文字を検索できます。
$("#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>
言語内での使用においては、正規表現は行ではなく文字列に作用します。そのため、入力文字列に複数の行があると仮定すると、正規表現を通常どおりに使用できるはずです。
この場合、 "<FooBar>"が存在するので、与えられた正規表現は文字列全体にマッチします。正規表現の実装の詳細に応じて、$ 1の値( "(。*)"から取得)は "fghij"または "abcde\nfghij"のいずれかになります。他の人が言っているように、いくつかの実装では "。"かどうかを制御できます。あなたに選択を与えて、改行と一致します。
行ベースの正規表現の使用は、通常egrepのようなコマンドライン用です。
通常、Powershellで3行連続して検索すると、次のようになります。
$file = get-content file.txt -raw
$pattern = 'lineone\r\nlinetwo\r\nlinethree\r\n' # "windows" text
$pattern = 'lineone\nlinetwo\nlinethree\n' # "unix" text
$pattern = 'lineone\r?\nlinetwo\r?\nlinethree\r?\n' # both
$file -match $pattern
# output
True
奇妙なことに、これはプロンプトでのUnixテキストですが、ファイル内のWindowsテキストです:
$pattern = 'lineone
linetwo
linethree
'
行末を印刷する方法は次のとおりです。
'lineone
linetwo
linethree
' -replace "`r",'\r' -replace "`n",'\n'
# output
lineone\nlinetwo\nlinethree\n
多くの場合、サブストリングの前の行にまたがる少数のキーワードでサブストリングを変更する必要があります。 xml要素を考えます。
<TASK>
<UID>21</UID>
<Name>Architectural design</Name>
<PercentComplete>81</PercentComplete>
</TASK>
81を他の値、たとえば40に変更するとします。最初に.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")
そして交換は以前のように正しく機能します。
Javaの特定のifブロックにマッチさせたい
...
...
if(isTrue){
doAction();
}
...
...
}
RegExpを使うと
if \(isTrue(.|\n)*}
それは私が使用したので、メソッドブロックのための右中括弧
if \(!isTrue([^}.]|\n)*}
ワイルドカードの一致から閉じ括弧を除外します。
一般的に。改行と一致しないので、((.|\n)*)<foobar>
を試してください。