476

たとえば、この正規表現

(.*)<FooBar>

一致します:

abcde<FooBar>

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

abcde
fghij<FooBar>
4

25 に答える 25

532

これを試して:

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

基本的には「任意の文字または改行」が0回以上繰り返されることを意味します。

于 2008-10-01T18:52:27.110 に答える
287

言語によって異なりますが、正規表現パターンに追加できる修飾子が必要です。PHPでは次のようになります。

/(.*)<FooBar>/s

末尾のsにより、ドットは改行を含むすべての文字と一致します。

于 2008-10-01T18:52:18.033 に答える
72

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

(?s).*<FooBar>
于 2011-11-25T13:16:55.893 に答える
42

多くの正規表現方言で/[\S\s]*<Foobar>/は、あなたが望むことだけを行います。ソース

于 2011-07-30T13:03:56.440 に答える
39

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

ドットは改行(\ r \ n)を除くすべてに一致します。したがって、すべての文字に一致する\ s\Sを使用します。

于 2012-07-19T17:59:45.447 に答える
18

Rubyでは、' m' オプション (複数行)を使用できます。

/YOUR_REGEXP/m

詳細については、 ruby-doc.orgの正規表現に関するドキュメントを参照してください。

于 2012-08-03T07:52:16.613 に答える
9

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

于 2008-10-01T18:52:28.233 に答える
8

Eclipse の場合、次の式が機能しました。

フー

じゃだじゃだバー」

正規表現:

Foo[\S\s]{1,10}.*Bar*
于 2013-01-03T11:32:13.277 に答える
5

使用する:

/(.*)<FooBar>/s

sドット(。)がキャリッジリターンと一致する原因。

于 2008-10-01T18:54:07.980 に答える
5

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

于 2008-10-02T03:31:26.990 に答える
4

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

Regex.Replace(content, searchText, replaceText, RegexOptions.Singleline);
于 2010-04-13T00:42:03.950 に答える
4

Java ベースの正規表現では、[\s\S].

于 2013-06-03T06:22:19.503 に答える
2

通常、.改行と一致しないので、試してください((.|\n)*)<foobar>

于 2008-10-01T18:52:56.220 に答える
2

解決:

パターン修飾子を使用sUすると、PHP で目的のマッチングが得られます。

例:

preg_match('/(.*)/sU', $content, $match);

ソース:

于 2012-04-04T11:00:26.493 に答える
1

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

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

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

于 2008-10-01T18:49:42.033 に答える
1

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

于 2019-02-27T12:50:43.143 に答える
1

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

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

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

上記のすべての提案を試してみましたが、うまくいきませんでした。私は.NET 3.5 FYIを使用しています。

于 2009-03-26T14:57:08.103 に答える
0

Java の特定のifブロックに一致させたい:

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

   }
...
...
}

正規表現を使用する場合

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

メソッドブロックの閉じ中括弧が含まれていたので、使用しました

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

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

于 2011-01-18T09:31:21.063 に答える
0

多くの場合、部分文字列の前の行にまたがるいくつかのキーワードで部分文字列を変更する必要があります。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")

交換は以前と同じように正しく機能します。

于 2012-04-21T20:05:32.873 に答える