我很难写出C ♯正则表达式。我想写一个可以捕获abc
的表达式。例如,我有一个字符串:
<a href="function(##abc##);function(##abc##)">
我想抓取abc
并将其替换为xyz
。
我尝试了类似(")([^"]*)(##abc##)([^"]*)(")
这会捕获abc
的第一次出现,但不捕获第二次出现的{{1}}。有人可以帮忙吗?
由于
答案 0 :(得分:0)
在某些编程语言中,您必须设置global-Flag以实现所有出现的匹配,而不仅仅是第一个。旗帜通常是“g”
答案 1 :(得分:0)
您可以使用匹配评估程序:
private class Replacer
{
private bool inQuotes;
public string Replace( Match m ){
if( m.Value == "\"" ){
inQuotes = ! inQuotes;
}else if ( inQuotes && m.Value == "##abc##" ){
return "##xyz##";
}
return m.Value;
}
}
input = "<a href=\"function(##abc##);function(##abc##)\">";
Console.WriteLine( Regex.Replace( input, "\"|(##abc##)", (new Replacer()).Replace ) );
哪个输出:
<a href="function(##xyz##);function(##xyz##)">
虽然如果您正在使用XML,您可能希望使用XPath首先在引号之间找到文本,然后使用正则表达式或直接字符串替换来进行替换。如果你正在使用HTML(不是XHTML),你可以使用像http://htmlagilitypack.codeplex.com/之类的库来做类似的事情。
或者(可能是最糟糕的选择)使用单个正则表达式这似乎可以完成这项工作,但并不漂亮:
Match match = (new Regex("(?:\")([^\"]*?(##abc##))+[^\"]*(?:\")")).Match(input);
然后,您可以遍历match.Groups [2] .Captures中的每个匹配项。虽然您必须使用每次捕获的索引和长度手动进行实际替换。