C#正则表达式引用重复命名组

时间:2019-07-15 09:44:46

标签: 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...

返回

None

即,在给定实例...中的最后一个匹配项。不知道如何引用文本的“所有”组,而不仅仅是给定实例中的最后一组。

对不起,我什至找不到“给定实例”的专有名称...。

3 个答案:

答案 0 :(得分:3)

您可以将重复的子字符串与CGAL::write_ply_point_set(out, points)进行匹配,然后在匹配评估器部分解开单独的大括号子字符串,并根据需要设置整个匹配的格式。

这里是一个例子:

CGAL::Vector_3

请参见C# demo,输出:

unsigned char

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); 的1个或多个重复,1 +个空格,然后匹配'subordinate': def1... 'subtropical': def2... 'super': def3... 'sum': def4... (?:\{b\s+[^{}]*})+以外的0个或更多个字符,直至并包括{{ 1}},然后找到匹配项时,将使用{b正则表达式处理该匹配项,该正则表达式仅匹配1个这样的序列,并捕获{ +空格之后和}替换之前的部分包含第1组内容。

答案 1 :(得分:2)

尝试一下:

  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...
   ";
  input = input.Replace("{b ", "").Replace("}", "");
  input = Regex.Replace(input, @"\n\s+(\w+)", @"\n'$1':");

模式说明:

\n\s+(\w+)-匹配换行符,一个或mroe空格,然后匹配一个或多个单词字符并将其存储在捕获组中。

答案 2 :(得分:1)

您可以使用\{b (?<Text>[^}]+)\}作为模式,并在将${Text}最初替换为\{.*\}之后,将其替换为'${0}':

当然,多行。