Skip to main content
 首页 » 编程设计

c#之组间正则表达式替换

2024年02月27日35Renyi-Fan

所以我在 C# 中有以下 regex.replace:

Regex.Replace(inputString, @"^([^,]*,){5}(.*)", @"$1somestring,$2"); 

其中 5 是代码中的可变数字,但这并不真正相关,因为在执行时它总是有一个设定值(例如 5 ).与 somestring, 相同。

本质上我想在两组之间输入somestring,。输出适用于 somestring,$2,但 $1 仅打印为 $1。所以说无论 (.*) 抓取 = "2, a, f2" 我得到的结果字符串是 $1somestring,2,a,f2 无论 $1 是什么。这是因为重复组功能 {5} 吗?如果是这样,我如何获取重复集合并将其放在我现在拥有 $1 的位置?

编辑:我知道第一组也正确捕获。我使用此正则表达式获取 somestring, 的内容:

Regex.Match(line, @"^([^,]*,){5}([0-9]+\.[0-9]+),.*"); 

第一部分与替换正则表达式中的第一组相同,并且工作正常,所以应该没有问题(它们都用于同一个字符串)。

编辑2:

好的,我会尝试解释更多的过程,因为有人说这很难理解。我有三个变量,line 是我使用的字符串,latIndex 和 lonIndex 只是整数(告诉我 , 是两个我寻找的 double 位于)。我有以下两个匹配项:

var latitudeMatch = Regex.Match(line, @"^([^,]*,){" + latIndex + @"}([0-9]+\.[0-9]+),.*"); 
var longitudeMatch = Regex.Match(line, @"^([^,]*,){" + lonIndex + @"}([0-9]+\.[0-9]+),.*"); 

然后我捕获 double :

var latitude = latitudeMatch.Groups[2].Value; 
var longitude = longitudeMatch.Groups[2].Value; 

我使用这些 double 从 Web API 获取字符串,我将其存储在名为 veiRef 的变量中。然后我想在 double 之后插入这些,使用以下代码(在 lat 或 lon 之后插入,具体取决于最后出现的那个):

if (latIndex > lonIndex) 
{ 
    line = Regex.Replace(line, @"^([^,]*,){" + (latIndex+1) + @"}(.*)",$@"$1{veiRef},$2"); 
} 
else 
{ 
    line = Regex.Replace(line, @"^([^,]*,){" + (lonIndex + 1) + @"}(.*)", $@"$1{veiRef},$2"); 
} 

但是,这会产生一个字符串 line,它前面没有插入 $1 的内容($2 可以正常工作)。

请您参考如下方法:

在模式的开头有一个重复的捕获组,您需要将其转换为非捕获组并用捕获组包裹。然后,您可以使用 $1 反向引用访问匹配的整个部分。

var line = "a, s, f, double, double, 12, sd, 1"; 
var latIndex = 5; 
var pat = $@"^((?:[^,]*,){{{latIndex+1}}})(.*)"; 
// Console.WriteLine(pat); // => ^((?:[^,]*,){6})(.*) 
var veiRef = "str"; 
line = Regex.Replace(line, pat, $"${{1}}{veiRef.Replace("$","$$")}$2"); 
Console.WriteLine(line); // => a, s, f, double, double, 12,str sd, 1 

参见 C# demo

模式 - ^((?:[^,]*,){6})(.*) - 现在包含 ((?:[^,]*,) {6}) 在 ^ 之后,这就是 $1 在找到匹配项后保存的内容。

由于您的替换字符串是动态的,因此您需要确保其中的任何 $ 都加倍(因此,.Replace("$","$$"))并且第一个反向引用是明确的,因此它应该看起来像 ${1}(无论 veiRef 是否以数字开头,它都会起作用)。

替换字符串的详细信息:

  • 它是一个内插字符串文字...
  • $" - 内插字符串文字的声明(开始)
  • ${{1}} - 文字 ${1} 字符串({ 和 }必须加倍以表示文字符号)
  • {veiRef.Replace("$","$$")} - 内插字符串文字中的一段 C# 代码(我们用单个 分隔允许代码的部分{...})
  • $2 - 文字 $2 字符串
  • " - 内插字符串文字的结尾。