我有一些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.
所以它们不匹配且没有变化。
答案 0 :(得分:1)
$&
确实是对整个比赛的反向引用。 $1
反向引用将替换为捕获到第一个捕获组中的值。
使用
%x\.(.*?)%
或
%x\.([^%]*)%
并替换为$1
反向引用。
C#:
var result = Regex.Replace(input, @"%x\.([^%]*)%", "$1");
在MSDN上查看有关Substitutions in Regular Expressions的更多信息。
要返回FOO
或BAR
,即返回第一个捕获组的内容,请使用
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")