我正在编写一个正则表达式来转换以下内容:
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/