2009-11-22 20 views
16

正規表現を複数行モードで使用してテキストを照合および置換するにはどうすればよいですか?C#の複数行正規表現

私はRegexOptions.Multilineオプションを知っていますが、C#の新しい行の文字とすべて一致するように指定する最良の方法は何ですか?

入力:

<tag name="abc">this 
is 
a 
text</tag> 

出力:

[tag name="abc"]this 
is 
a 
test 
[/tag] 

Aahh、私は実際の問題を発見しました。 '&'と ';'正規表現では、改行がある場合にも正規表現でエスケープする必要がありますが、1行に一致するテキストがあります。

+0

えっ:C#ので

[$1 name="$2"]$3[/$1] 

が、これは次のようになりますか? & and ;は、正規表現に特殊文字はありません。あなたは例を挙げることができますか? –

+0

似たようなものですが、下記の例は試していません。 rx.Replace( "name [=] " abc ""、 "abc"、 "multiline text"); –

答えて

43

にはがあり、一致する式の改行文字であることを意味する場合は、\nがそれを行います。

そうしないと、Multiline/Singlelineフラグが間違っていると思います。式を複数の行に渡って一致させるには、実際にRegexOptions.Singlelineを使用します。つまり、入力文字列全体を1行として扱い、改行を無視するということです。これはあなたが何をしているのか...?

Regex rx = new Regex("<tag name=\"(.*?)\">(.*?)</tag>", RegexOptions.Singleline); 
String output = rx.Replace("Text <tag name=\"abc\">test\nwith\nnewline</tag> more text...", "[tag name=\"$1\"]$2[/tag]"); 
+0

改行文字を含む可能性のあるテキストを一致させたいが、必ずしも一致する必要はない。今、あなたがRegexOptions.Singlelineで言うなら、これを行う方法の例を私に教えてください。 –

+0

私の編集例を見てください。私はそれをテストしたときにデフォルトのthoと誤解されているようです...手動で一重線を指定すると、例のようになります、 –

+0

ありがとう、問題は違うようですが、マルチラインモードについて –

12

ここでマッチする正規表現です。 RegexOptions.Singlelineオプションが必要です。これにより、.の改行が一致します。

<(\w+) name="([^"]*)">(.*?)</\1> 

この正規表現の後、最初のグループにはタグが含まれ、2番目のタグには3番目のタグが含まれます。だから、置換文字列は次のようになります。

newString = Regex.Replace(oldString, 
    @"<(\w+) name=""([^""]*)"">(.*?)</\1>", 
    "[$1 name=\"$2\"]$3[/$1]", 
    RegexOptions.Singleline); 
+1

+1:非常に良いコードと説明。 @Priyank Bolia:これは、をネストすることができない場合にのみ機能します。彼らが*できる*場合、正規表現はあなたに失敗します。 –

+0

優秀な例をありがとう、私は考え出した、それはしかし別の問題だった。 –