正则表达式在 C# 中按组替换

Posted

技术标签:

【中文标题】正则表达式在 C# 中按组替换【英文标题】:Regex replace by group in C# 【发布时间】:2019-05-23 17:03:45 【问题描述】:

我正在尝试在 C# 中使用正则表达式替换,尽管我在让模式正确对齐时遇到了一些问题。我要做的是根据前两组替换某些组合,但如果它与第三组的模式匹配则不替换。到目前为止我所拥有的是

 var pattern = @"(,)|(\[\)|(^:\[[*]])";

 string NewLineValue = Regex.Replace(LineValue, pattern,Environment.NewLine);

基本上我想替换字符串中的所有逗号或[ 组合,但如果逗号出现在[[]] 字符内(例如[[1234,5678]]),则不替换

非常感谢任何帮助...

【问题讨论】:

将字符“^”放在方括号内时用于创建一个否定字符类。您在第三组中使用它的方式仅意味着它是文本的开头。 听起来你想解析一个 JSON 文件..... 一个简短的输入示例和所需的输出可能会有所帮助。此外,如果您不想像@CamiloTerevinto 猜测的那样解析 JSON 文件(如果是的话,您可能会更容易),请尝试使用负前瞻。见:regular-expressions.info/lookaround.html @CamiloTerevinto 这是最终目标,但是目前我正试图将一些条目转换为可读格式,以供最终用户确定需要哪些元素......行项目在文件中也不遵循一致的格式,因为它们是活动日志条目并且逐行更改。 @shwartz,谢谢。如果“^”符号出现在 [[x]] 部分中,您能否详细说明需要放置“^”符号以忽略“,”的位置?非常感谢您的建议。 【参考方案1】:

您需要匹配并捕获[[]] 之间的所有子字符串(要在结果字符串中恢复),然后在所有其他上下文中匹配,[ 以替换为换行符:

var pattern = @"(?s)(\[\[.*?]])|,|\[";
var result = Regex.Replace(s, pattern, m => 
    m.Groups[1].Success ? m.Groups[1].Value : Environment.NewLine);

模式匹配:

(?s) - RegexOptions.Singleline 内联选项 (\[\[.*?]]) - 第 1 组:[[,任何 0+ 个字符,尽可能少,然后是 ]] | - 或 , - 逗号 | - 或 \[ - [ 子字符串。

如果第 1 组匹配 (m.Groups[1].Success),则将匹配粘贴回 (m.Groups[1].Value),否则,匹配 (,[) 将替换为 Environment.NewLine

【讨论】:

以上是关于正则表达式在 C# 中按组替换的主要内容,如果未能解决你的问题,请参考以下文章

C# 正则表达式 Replace的功能

使用正则表达式c#替换文档中的文本字段

C# 正则表达式转义和替换

正则表达式替换 char 并在 .net C# 中转换为大写

C# 中的正则表达式大写替换

C# 中的正则表达式大写替换