C# regex 引用重复命名组

标签 c# regex

我正在编写一个正则表达式来转换以下内容:

string input = @"
 {b sub}{b or}{b di}{b nate} def1...
 {b sub}{b tro}{b pi}{b cal} def2...
 {b su}{b per} def3...
 {b sum} def4...
 ";

进入此:

'subordinate': def1...
'subtropical': def2...
'super': def3...
'sum': def4...

也就是说,我需要删除 '{b ' 和 '}' 并对其进行装饰等。

我不知道该怎么做。我知道如何匹配 {b } 但不知道如何匹配所有它们并用引号装饰它。

Regex.Replace(input, @"(\{b (?<Text>[^ }]+)})+", @"'${Text}'") 

返回

 'nate' def1...
 'cal' def2...
 'per' def3...
 'sum' def4...

即,只是给定实例中的最后一场比赛......不知道如何引用“所有”文本组,而不仅仅是给定实例中的最后一组。

抱歉,我什至找不到“给定实例”的正确名称......

最佳答案

您可以将重复的子字符串与 Regex.Replace 进行匹配然后取消匹配评估器部分中单独的大括号子字符串的括号,并根据需要格式化整个匹配。

这是一个例子:

string input = @"{b sub}{b or}{b di}{b nate} def1...
{b sub}{b tro}{b pi}{b cal} def2...
{b su}{b per} def3...
{b sum} def4... ";
string result = Regex.Replace(input, @"(?:\{b\s+[^{}]*})+", m =>
            "'" + Regex.Replace(m.Value, @"\{b\s+([^{}]*)}", "$1") + "':");
Console.WriteLine(result);

请参阅C# demo ,输出:

'subordinate': def1...
'subtropical': def2...
'super': def3...
'sum': def4... 

(?:\{b\s+[^{}]*})+表达式匹配 {b 的 1 次或多次重复、 1+ 个空格,然后是 0 个或多个除 { 之外的字符和}直至并包括 } ,然后,当找到匹配项时,将使用 \{b\s+([^{}]*)} 对其进行处理只匹配 1 个这样的序列并捕获 b 之后的部分的正则表达式+ 和之前的空格 }将其替换为第 1 组内容。

关于C# regex 引用重复命名组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57037141/

相关文章:

regex - 如何验证欧盟社会安全号码?

python - 使用正则表达式解析 Apache 日志

c# - 如何刷新内容页面上的项目?

c# - PostMessage 和 SendMessage WM_SETCURSOR、WM_LBBUTTONDOWN/UP 等都发送 xPox0、yPos0

c# - 小数超出范围 C# 和 SQL Server

c# - 使用 Caliburn Micro 的简单注入(inject)器 GetAllInstances 抛出异常

regex - grep 中支持的正则表达式转义序列

python - 删除数字及其后面的任何特殊字符或字母(来自邮政地址)

regex - symfony2 中的正则表达式安全模式

c# - 将 double 加在一起