【问题标题】:Regex - capturing repeated groups in C#正则表达式 - 在 C# 中捕获重复的组
【发布时间】:2012-01-11 17:31:41
【问题描述】:

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

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

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

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

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

谢谢

【问题讨论】:

  • 顺便说一句:您的正则表达式过于复杂,在这里也可以进行正常的搜索和替换。
  • C# .net 是我正在使用的我想使用 regex.replace 函数来处理它。有可能吗?
  • 我不能使用它,因为我正在使用 xml 和 xslt.. 如果它在标签中,我必须用差异值替换它,如果它不是标签,我必须用差异值替换它:(
  • @llya kogan C# .net 是我正在使用的我想使用 regex.replace 函数来处理它。是否可以?我正在使用 xml 和 xslt.. 如果它在标签中,我必须用差异值替换它,如果它不是标签,我必须用差异值替换它:(
  • 请编辑您的问题以提供更多信息,而不是评论您自己的问题。这不是聊天室,而是问答网站。提供信息并在问题文本中提出您的问题,如果以后需要添加更多信息或细节,您可以编辑您的问题以提供它们。如果您的所有信息都在一个地方而不是分散在 cmets 中,那么阅读您的问题并希望提供帮助的人会更容易。谢谢。 :)

标签: c# regex


【解决方案1】:

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

【讨论】:

  • 这里不适用。 Regex#Replace(实例方法,而不是静态方法)默认是全局的,但您可以指定要进行的最大替换次数。
【解决方案2】:

您可以像这样使用匹配评估器:

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

【讨论】:

  • 你能帮我把额外的参数传递给 matchevaluator.. 我知道它是一个委托,我们可以传递它.. 但我想传递 2 个字符串作为参数你能帮我吗?
猜你喜欢
  • 2011-09-19
  • 1970-01-01
  • 2017-09-13
  • 2011-03-11
  • 2017-01-07
  • 2019-12-19
  • 1970-01-01
  • 2021-06-16
相关资源
最近更新 更多