在 C# 中仅检索正则表达式的替换模板

Retrive only replacement template of regex in C#


我可以只得到 Regex.Replace 的替代品吗?
例子。
String text = @"asdfgs sda gsa ga s
SECTOR:124 NAME:Ricko
asdfgs sda gsa ga s";
String regex = "^SECTOR:(\d+) NAME:(\w+)";
String substitution = " ";

String result = Regex.Replace(text, regex, substitution);

Console.WriteLine(result);

正常结果

asdfgs sda gsa ga s
Ricko 124

想要的结果

Ricko 124

Thaaaanks

您应该使用 Regex.Match 提取文本,然后连接第 2 组和第 1 组值:

Match m = Regex.Match(text, regex, RegexOptions.Multiline);
if (m.Success) {
    String result = $"{m.Groups[2].Value} {m.Groups[1].Value}";
    Console.WriteLine(result);
}

参见C# demo

注:

    添加
  • RegexOptions.Multiline 因为您的字符串包含多行,并且您需要将行的开头与 ^
  • 匹配
  • Regex.Match returns 字符串中的第一个匹配项
  • if (m.Success) 用于检查给定的字符串和模式是否匹配
  • m.Groups[1].Value 包含第一个捕获组值,m.Groups[2].Value 包含第二个捕获组值,依此类推。

您没有匹配您想要保留但应删除的内容周围的所有字符。

您可以让点匹配换行符并使用多行标志作为锚点。

(?sm).*?^SECTOR:(\d+) NAME:(\w+).*

模式匹配:

  • (?sm) 具有匹配换行符和多行符的点的内联标志
  • .*? 尽可能少地匹配包括换行符在内的任何字符
  • ^ 字符串开头
  • SECTOR:(\d+) NAME:(\w+) 第 1 组 SECTOR: 捕获 1+ 个数字,并在 [=30] 中捕获 1+ 个字符=]组 2 NAME:
  • .* 匹配其余行

例子

String text = @"asdfgs sda gsa ga s
SECTOR:124 NAME:Ricko
asdfgs sda gsa ga s";
String regex = @"(?sm).*?^SECTOR:(\d+) NAME:(\w+).*";
String substitution = " ";

String result = Regex.Replace(text, regex, substitution);

Console.WriteLine(result);

输出

Ricko 124