所以我在 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字符串"- 内插字符串文字的结尾。
