正则表达式 - 用分隔符之间的中间替换匹配

时间:2016-08-17 15:20:20

标签: c# regex

我有一些html,我试图解析哪些有一些合并变量。变量是分隔的,从%x.开始,以%结尾。例如:%x.VALUE%我要做的是用“VALUE”替换整个匹配。

因此,%x.VALUE%变为VALUE

我尝试使用

使用MSDN的替换示例
string input = "aaaaa%nomatch%bbb%x.FOO%ccc%x.BAR%ddddd%%";
string pattern = @"%x.(.*?)%";
string substitute = "$&";

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

我尝试了几个不同的替换字符串,但都没有用。我意识到$&只是将其替换为自身,所以它并没有真正做任何事情,但我不知道如何用中间替换整个匹配。它是否使用某种嵌套的正则表达式?

修改 对于该字符串,我希望结果是

aaaaa%nomatch%bbbFOOcccBARddddd%%

此处%x.FOO%已替换为FOO%x.BAR%已替换为BAR,但其他%没有x.所以它们不匹配且没有变化。

2 个答案:

答案 0 :(得分:1)

$&确实是对整个比赛的反向引用。 $1反向引用将替换为捕获到第一个捕获组中的值。

使用

%x\.(.*?)%

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

并替换为$1反向引用。

C#:

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

在MSDN上查看有关Substitutions in Regular Expressions的更多信息。

要返回FOOBAR,即返回第一个捕获组的内容,请使用

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

请参阅the regex demo

答案 1 :(得分:1)

您需要使用.转义\.。否则,它会匹配任何东西。 $1用于引用第一个组(.+?)

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