CSharp Regex匹配

randolf2022年8月17日
大约 1 分钟

CSharp Regex匹配

基本正则匹配

匹配

匹配是替换操作的子集,直接使用

Regex.Match

就可以了

替换

替换前 N 个

Regex rgx = new Regex(pattern); 
string newFileText = rgx.Replace(fileText, "", 1);

这里是替换第 1 个

替换全部

string patternMd = @"(?<show>!?)\[(?<name>.*)\]\((?!http)(?<content>.+?)\)";
MatchEvaluator evaluator = new MatchEvaluator(x => ChangeWikiLink(x, filePath, destVaultPath));
string newFileText = Regex.Replace(fileText, patternMd, evaluator);


static string ChangeWikiLink(Match match, string filePath, string destVaultPath)

调用 MatchEvaluatorRegex.Replace 可以进行自定义批量替换操作

平衡括号组替换

这个指的是希望替换匹配某个平衡组,类似匹配 html 中的 tag 之类的。下面给一个实际应用:

期望能够将 TeX 源码中的 \color[RGB]{240, 0, 0} 转换为 \color{red} 来实现在 KaTeX 中的正确显示,这就涉及到匹配 {} 的数目。代码如下:

/// <summary>
/// 给文件中数学公式上下行增加空格,修改公式颜色设置
/// </summary>
/// <param name="fileText">文件信息</param>
/// <returns>替换完成的文本</returns>
public static string ReplaceMathText(this string fileText)
{
	string newText = fileText.Replace("
$$
", "\n
$$
\n");

	// equivalnet bracket search
	var pattern = @"
		\{                          # the first {
		\\color\[RGB\]\{[^{}]+\}    # The func name
		(?<content>                 # the content
			(?:                 
			[^\{\}]                 # Match all non-braces
			|
			(?<open> \{ )           # Match '{', and capture into 'open'
			|
			(?<-open> \} )          # Match '}', and delete the 'open' capture
			)+
			(?(open)(?!))           # Fails if 'open' stack isn't empty!
		)
		\}                          # Last '}'
	";
	MatchEvaluator evaluator = new MatchEvaluator(ReplaceTeXColor);
	string newFileText = Regex.Replace(newText, pattern, evaluator, RegexOptions.IgnorePatternWhitespace);
	return newFileText;

	static string ReplaceTeXColor(Match match)
	{
		string content = match.Groups["content"].Value.Trim();
		StringBuilder stringBuilder = new StringBuilder();
		stringBuilder.Append(@"{\color{red}");
		stringBuilder.Append(content);
		stringBuilder.Append("}");
		return stringBuilder.ToString();
	}
}

这也应用在 obsidian 转 vuepress 博客项目中

方案

参考

引文
脚注
Loading...