正则表达式 - 在C#中捕获重复的组

时间:2012-01-11 17:31:41

标签: c# regex

我很难写出C 正则表达式。我想写一个可以捕获abc的表达式。例如,我有一个字符串:

<a href="function(##abc##);function(##abc##)">

我想抓取abc并将其替换为xyz

我尝试了类似(")([^"]*)(##abc##)([^"]*)(")

的内容

这会捕获abc的第一次出现,但不捕获第二次出现的{{1}}。有人可以帮忙吗?

由于

2 个答案:

答案 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中的每个匹配项。虽然您必须使用每次捕获的索引和长度手动进行实际替换。