我有一個問題,例如我有一個文本:
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\]"
uj5u.com熱心網友回復:
您需要匹配并捕獲markdown鏈接部分,并且只匹配您需要轉義的字符,然后在替換部分使用匹配評估器:
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 組匹配[,然后是除[and](with[^][]*)以外的零個或多個字符,然后是一個]字符(,然后是除(and)(with[^()]*)以外的零個或多個字符,然后是一個)字符|- 或者[][()*_]- 匹配的字符類:(]注意它沒有被轉義,因為它是字符類中的第一個字符)[、(、)、*或_字符。
的m => m.Groups[1].Success ? m.Groups[1].Value : $@"\{m.Value}"替換替換第1組值中發現的匹配組,如果1匹配,否則,替換是匹配值(在字符類中定義的特殊字符)用\預先考慮。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/330741.html
下一篇:如何在圖片框角上繪制圓角橢圓?
