如何使用转义字符(,),[,],*,_,而不改变链接结构:[]()



我有以下文本:

input = "text, *text*, text, text, (text), [text], [text](http://.....) *text*, text, text, (text), [text]"

我想替换字符 '_', '*', '[', ']', '(', ')' 来 '_', '*' 等。

我写:

pattern = @"(?<![(?<text>.*)]((?<url>.*))([[]()*_])";
input = Regex.Replace(input, pattern, @"$1");
System output: "text, *text*, text, text, (text), [text], [some_text with _ * ](http://.....) *text*, text, text, (text), [text]"

如何确保链接[]()的设计不改变?例如,它看起来像:

desired output:"text, *text*, text, text, (text), [text], [some_text with _ *](http://.....) *text*, text, text, (text), [text]"

您需要匹配并捕获标记链接部分,并且只匹配您需要转义的字符,然后在替换部分使用匹配求值器:

var input = "text, *text*, text, text, (text), [text], [some_text with _*](http://.....) *text*, text, text, (text), [text]";
var pattern = @"([[^][]*]([^()]*))|[][()*_]";
Console.WriteLine(Regex.Replace(input, pattern, m => 
m.Groups[1].Success ? m.Groups[1].Value : $@"{m.Value}"));

参见c#演示。细节:

  • ([[^][]*]([^()]*))-捕获匹配[的组1,然后捕获[]以外的零个或多个字符(与[^][]*),然后捕获]字符,(,然后捕获()以外的零个或多个字符(与[^()]*),然后捕获)字符
  • |-或
  • [][()*_]-匹配以下字符类:](注意它没有转义,因为它是字符类中的第一个字符),[,(,),*_字符。

如果组1匹配,则m => m.Groups[1].Success ? m.Groups[1].Value : $@"{m.Value}"替换为组1的匹配值,否则替换为加前缀的匹配值(字符类中定义的特殊字符)。

最新更新