2016-08-17 10 views
1

いくつかのhtmlを解析しようとしていますが、いくつかのマージ変数があります。変数は区切られ、%x.で始まり、%で終わります。例:%x.VALUE%私がしようとしているのは、一致全体を「VALUE」だけに置き換えることです。正規表現をデリミタ間の中間に置き換えてください

したがって、%x.VALUE%はちょうどVALUEになります。

私は

string input = "aaaaa%nomatch%bbb%x.FOO%ccc%x.BAR%ddddd%%"; 
string pattern = @"%x.(.*?)%"; 
string substitute = "$&"; 

string result = Regex.Replace(input, pattern, substitute); 

を使用してMSDNの代替例を使用してみましたし、私は別の置換文字列のカップルでそれを試みたが、どれも働きました。 $&はそれ自体で置き換えられるので、実際には何もしませんが、マッチ全体をちょうど中間に置き換える方法はわかりません。何らかのネストされた正規表現を使用していますか?

編集:その文字列の場合 、私は結果が

aaaaa%nomatch%bbbFOOcccBARddddd%% 
ここ %x.FOO%

のでx.を持っていないが、他のBAR%に置き換えFOO%x.BAR%に置き換えられますことを期待します彼らは一致しておらず、変更されていません。

+0

その入力に対して期待される出力を与えることはできますか? – Xiaoy312

+0

それには '$ 1'を使います。そして、その点を脱出する。 –

+0

これを試してみてください ""%x [^%] + "; – jdweng

答えて

1

$&は完全一致の逆参照であることは事実です。 $1の後方参照は、の代わりに最初のキャプチャグループにをキャプチャします。

使用

%x\.(.*?)% 

または

%x\.([^%]*)% 

そして$1後方参照と交換してください。

のC#:

var result = Regex.Replace(input, @"%x\.([^%]*)%", "$1"); 

は、MSDNでSubstitutions in Regular Expressionsについての詳細を参照してください。

var results = Regex.Matches(input, @"%x\.([^%]*)%") 
     .Cast<Match>() 
     .Select(p => p.Groups[1].Value) 
     .ToList(); 

を使用する、即ち、第1のキャプチャグループの内容を返すように、FOO又はBARを返すことがthe regex demoを参照してください。

+1

それは本当にクールなデモだと思います、ありがとう! – nurdyguy

1

.\.でエスケープする必要があります。それ以外の場合は、何でも一致します。 $1は、最初のグループを参照するためのもので、(.+?)です。

// returns: aaaaa%nomatch%bbbFOOcccBARddddd%% 
Regex.Replace(
    "aaaaa%nomatch%bbb%x.FOO%ccc%x.BAR%ddddd%%", 
    @"%x\.(.+?)%", 
    "$1") 
+0

これは素晴らしい、ありがとうございます。側面の質問として、もし私がマッチ 'FOO'と' BAR'(置換をしない)を返そうとすると、どうすればいいのですか?私は完全な '%xを得続けます。FOO% 'が返されました。 – nurdyguy

+1

私の更新された回答を参照してください。 –

+0

ありがとう@WiktorStribiżew! – nurdyguy

関連する問題