C#正则表达式替换追加换行符

时间:2018-07-24 08:48:27

标签: c# regex newline

我正在读取配置文件的内容,然后尝试解析特定设置:

var content = File.ReadAllText(PsdFile);
var version = Regex.Replace(content, @"ModuleVersion\s+=\s+'(\d+)\.(\d+)\.(\d+)'", "$1.$2.$3");

我将输入文件设置为:

ModuleVersion = '3.1.11'\r\n

这是VS变量预览。文件末尾包含一个空行。 执行上面的代码后,version变量包含:

3.1.11\r\n

因此它已被匹配并正确地识别了捕获组,但是由于某些原因它要附加\ r \ n。我不明白为什么。

它似乎与文件中的换行符有关。如果删除换行符,则换行符不会附加到替换的字符串中。最终捕获组如何匹配最终版本的三元组和换行符,但排除单引号呢?

1 个答案:

答案 0 :(得分:2)

Regex.Replace(content, @"ModuleVersion\s+=\s+'(\d+)\.(\d+)\.(\d+)'", "$1.$2.$3")行代码执行ModuleVersion\s+=\s+'(\d+)\.(\d+)\.(\d+)'模式的正则表达式搜索,即搜索ModuleVersion,1+空格,=,1+空格,',然后将1个以上的数字捕获到组1中,然后匹配一个点,然后将1个以上的数字捕获到组2中,再次匹配一个点并将另一个1+的数字放入组3中,并匹配一个{{1 }} char,然后将整个匹配项替换为组1值',组2值,.和组3值。

因此,如您所见,对于换行符没有任何作用,并且当您仍然使用点作为分隔符时,捕获这3个组几乎没有意义。

您似乎正在做的是提取一个值。使用.提取单个文本:

Regex.Match

请参见regex demo。在这里,var version = ""; var m = Regex.Match(content, @"(?<=ModuleVersion\s+=\s+')\d+(?:\.\d+)+"); if (m.Success) { version = m.Value; } 是一个向后隐藏,要求(?<=ModuleVersion\s+=\s+'),1+个空格,ModuleVersion,1+个空格和=出现在当前位置的左侧。

请注意,您还可以使用捕获方法并从'获取结果:

match.Groups[1].Value