我正在读取配置文件的内容,然后尝试解析特定设置:
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。我不明白为什么。
它似乎与文件中的换行符有关。如果删除换行符,则换行符不会附加到替换的字符串中。最终捕获组如何匹配最终版本的三元组和换行符,但排除单引号呢?
答案 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