【发布时间】:2017-12-10 08:58:51
【问题描述】:
所以我在 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 只是整数(告诉我在什么之间,我寻找的两个双打位于)。我有以下两个匹配项:
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;
我使用这些双精度从 Web API 获取字符串,并将其存储在名为 veiRef 的变量中。然后我想在双打之后插入这些,使用以下代码(在纬度或经度之后插入,具体取决于最后出现的那个):
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 可以正常工作)。
【问题讨论】:
-
只是一个习惯/代码标准。除非我 想要 使用特殊的字符串字符,否则我基本上都会使用它。这是一个 C# 转义字符(表示逐字字符串)。
-
只是为了澄清,有人问我为什么在替换字符串中使用@。只是把它放在这里以防有人对我为什么写那条评论感到困惑。
-
我有一个这样的字符串:
a, s, f, double, double, 12, sd, 1。双打出现的地方是动态的,我想在双打之后插入一些东西(因此5是一个变量)。所以使用这个例子,我想把字符串变成:a, s, f, double, double, somestring, 12, sd, 1. -
所以实际上我的正则表达式看起来像这样:
var latitudeMatch = Regex.Match(line, @"^([^,]*,){" + latIndex + @"}([0-9]+\.[0-9]+),.*");和line = Regex.Replace(line, @"^([^,]*,){" + (latIndex+1) + @"}(.*)",$@"$1{veiRef}$2"); -
..为什么我回答后人们总是删除他们的 cmets
标签: c# regex regex-group