web-dev-qa-db-ja.com

正規表現で複数の行にまたがって任意の文字を一致させるにはどうすればよいですか。

たとえば、この正規表現

(.*)<FooBar>

一致します:

abcde<FooBar>

しかし、どうすればそれを複数の行にまたがって一致させることができますか?

abcde
fghij<FooBar>
283
andyuk

これは言語に依存しますが、正規表現パターンに追加できる修飾子があるはずです。 PHPでは、

/(.*)<FooBar>/s

最後のsは、ドットを改行を含めてallに一致させます。

203
Jeremy Ruten

これを試して:

((.|\n)*)<FooBar>

それは基本的に「任意の文字または改行」が0回以上繰り返されたと言います。

286
levik

Eclipse検索を使用している場合は、「DOTALL」オプションを有効にして「。」を作成できます。行区切り文字を含む任意の文字に一致します。検索文字列の先頭に「(?s)」を追加するだけです。例:

(?s).*<FooBar>
65
Paulo Merson

JavaScriptでは、/[\S\s]*<Foobar>/を使用してください。 出典

31
Abbas Shahzadeh

([\s\S]*)<FooBar>

ドットは改行(\ r\n)以外のすべてにマッチします。そのため、すべての文字に一致する\ s\Sを使用してください。

27
samwize

RubyRuby あなたは 'm'オプションを使うことができます(複数行) :

/YOUR_REGEXP/m

より詳しい情報はRuby-doc.orgの Regexpドキュメント を参照してください。

18
vibaiher

私達はまた使用してもいいです

(.*?\n)*?

欲張らずに改行を含むすべてのものに一致させる

これは新しい行をオプションにします

(.*?|\n)*?
11
RAN_0915

"."は通常、改行と一致しません。ほとんどの正規表現エンジンでは、"."を改行にも一致させるためにS-フラグ(DOTALLおよびSINGLELINEとも呼ばれる)を追加できます。それでもうまくいかない場合は、[\S\s]のようにすることができます。

8
Markus Jarderot

Eclipseの場合、次の式で動作しました。

フー

ジャダジャダバー」

正規表現:

Foo[\S\s]{1,10}.*Bar*
7
Gordon
/(.*)<FooBar>/s

sを指定すると、ドット(。)はキャリッジリターンと一致します。

5
Bill

Javaベースの正規表現では[\s\S]を使うことができます

4
Kamahire

RegexOptions.Singlelineを使用すると、の意味が変わります。改行を含める

Regex.Replace(content、searchText、replaceText、RegexOptions.Singleline);

3
shmall

(.|\n)*は(例えば)[\s\S]*(あなたの言語の正規表現がそのようなエスケープをサポートしている場合)よりも効率が悪くなることがあることに注意してください。改行にもマッチします。あるいは、[[:space:][:^space:]]*のようなPOSIXyの選択肢を使うこともできます。

3
tye

溶液:

パターン修飾子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

2
Sian Lerk Lau

私は同じ問題を抱えていて、おそらく最善の方法ではないがそれを解決したが、それはうまくいく。本当の試合をする前に、すべての改行を置き換えました。

mystring= Regex.Replace(mystring, "\r\n", "")

私はHTMLを操作しているので、この場合改行は私には関係ありません。

私は上の提案をすべて試してみましたが、私は.Net 3.5を使用しています。

1
Slee

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&lt;Foobar&gt;</textarea>
1
Paul Jones

言語内での使用においては、正規表現は行ではなく文字列に作用します。そのため、入力文字列に複数の行があると仮定すると、正規表現を通常どおりに使用できるはずです。

この場合、 "<FooBar>"が存在するので、与えられた正規表現は文字列全体にマッチします。正規表現の実装の詳細に応じて、$ 1の値( "(。*)"から取得)は "fghij"または "abcde\nfghij"のいずれかになります。他の人が言っているように、いくつかの実装では "。"かどうかを制御できます。あなたに選択を与えて、改行と一致します。

行ベースの正規表現の使用は、通常egrepのようなコマンドライン用です。

1
nsayer

通常、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
0
js2010

多くの場合、サブストリングの前の行にまたがる少数のキーワードでサブストリングを変更する必要があります。 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")

そして交換は以前のように正しく機能します。

0
user1348737

Javaの特定のifブロックにマッチさせたい

   ...
   ...
   if(isTrue){
       doAction();

   }
...
...
}

RegExpを使うと

if \(isTrue(.|\n)*}

それは私が使用したので、メソッドブロックのための右中括弧

if \(!isTrue([^}.]|\n)*}

ワイルドカードの一致から閉じ括弧を除外します。

0
Spangen

一般的に。改行と一致しないので、((.|\n)*)<foobar>を試してください。

0
tloach