Regex-捕获C#中的重复组
本文关键字:捕获 Regex- | 更新日期: 2023-09-27 18:20:12
我很难写一个C♯正则表达式。我想写一个可以捕捉abc
的表达式。例如,我有一个字符串:
<a href="function(##abc##);function(##abc##)">
我想捕获abc
并将其替换为xyz
。
我试过类似(")([^"]*)(##abc##)([^"]*)(")
的东西
这捕获了abc
的第一次出现,但没有捕获第二次出现。有人能帮忙吗?
感谢
在某些编程语言中,您必须设置一个全局标志,以实现所有事件都匹配,而不仅仅是第一次。旗帜通常是一个"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]。捕获。尽管您必须根据每个捕获的索引和长度手动进行实际替换。