Regex-捕获C#中的重复组

本文关键字:捕获 Regex- | 更新日期: 2023-09-27 18:20:12

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

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

我想捕获abc并将其替换为xyz

我试过类似(")([^"]*)(##abc##)([^"]*)(") 的东西

这捕获了abc的第一次出现,但没有捕获第二次出现。有人能帮忙吗?

感谢

Regex-捕获C#中的重复组

在某些编程语言中,您必须设置一个全局标志,以实现所有事件都匹配,而不仅仅是第一次。旗帜通常是一个"g"

您可以使用这样的匹配计算器:

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中的每个匹配项进行迭代。组[2]。捕获。尽管您必须根据每个捕获的索引和长度手动进行实际替换。