组间正则表达式替换

Regex Replace between groups

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

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

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

相同

本质上我想在两组之间输入somestring,。输出适用于 somestring,,但 </code> 仅打印为 <code>。因此,无论 (.*) 抓住什么 = "2, a, f2",无论 </code> 是什么,我得到的结果字符串都是 <code>somestring,2,a,f2。这是因为重复组功能 {5} 吗?如果是这样,我如何获取重复的集合并将其放在我现在 </code> 的位置?</p> <p>编辑:我知道第一组也正确捕获。我使用此正则表达式获取 <code>somestring, 的内容:

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

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

编辑 2:

好的,我会尝试解释更多的过程,因为有人说很难理解。我有三个变量,line 一个我使用的字符串,latIndexlonIndex 只是整数(告诉我我要查找的两个双打之间的位置)。我有以下两个匹配项:

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

然后我抢双打:

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

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

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

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

在重复捕获组周围添加一个额外的组似乎可以为您提供的示例提供所需的输出。

Regex.Replace("a, s, f, double, double, 12, sd, 1", @"^(([^,]*,){5})(.*)", @"somestring,");

我不是 RegEx 专家,有人可能比我解释得更好,但是:-

第 1 组是 5 个重复捕获组的集合 第 2 组是最后一个重复捕获组 第 3 组是 5 个重复捕获组之后的文本。

您在模式的开头有一个重复的捕获组,您需要将其转换为非捕获组并用捕获组包裹。然后,您可以使用 </code> 反向引用访问整个匹配部分。</p> <pre><code>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("$","$$")}"); Console.WriteLine(line); // => a, s, f, double, double, 12,str sd, 1

C# demo

模式 - ^((?:[^,]*,){6})(.*) - 现在在 ^ 之后包含 ((?:[^,]*,){6}),现在这就是 </code> 在找到匹配项后保持的内容。</p> <p>因为你的替换字符串是动态的,你需要确保里面的任何 <code>$ 都加倍(因此,.Replace("$","$$"))并且第一个反向引用是明确的,因此它应该看起来像 </code>(无论 <code>veiRef 是否以数字开头,它都会起作用)。

替换字符串的详细信息:

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