我有以下文本:
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的匹配值,否则替换为加前缀的匹配值(字符类中定义的特殊字符)。