匹配行尾或其他字符

时间:2016-02-05 09:01:14

标签: c# regex

我正在尝试编写一个可以匹配“key = value”的正则表达式,直到行结束或表示注释开始的符号。

例如,让'#'表示注释,并假设我有一个包含以下内容的文件:

k1 = v1 
k2 = v2 # this is a comment
k3 = v3

然后我希望我的表达式匹配“k1 = v1”,“k2 = v2”和“k3 = v3”。

我可以使用以下方式匹配文本而不添加评论:

^(?'key'.+)\=(?'value'.+)

问题是我无法弄清楚如何匹配直到'#'或'\ n'

2 个答案:

答案 0 :(得分:0)

(?:^|(?<=\n))(?'key'.+?)\=(?'value'.+?(?=#|\n|$))

您可以使用lookarounds来完成工作。见演示。

https://regex101.com/r/eB8xU8/3

答案 1 :(得分:0)

你的正则表达式没有问题,除了最后一个点

^(?'key'.+)\=(?'value'[^#\n]+)

如果用替换的字符类[^#\ n]替换它,它将起作用

此外,如果键值对位于同一个文件中(而不是逐行),则应启用多行模式,以便^在每行开头匹配

在C#中变为

var subjectString = @"k1 = v1 
k2 = v2 # this is a comment
k3 = v3";

Regex regexObj = new Regex(@"^(?'key'.+)\=(?'value'[^#\n]+)", RegexOptions.Multiline);
Match matchResult = regexObj.Match(subjectString);
while (matchResult.Success)
{
    Console.WriteLine(matchResult.Groups["key"].Value);
    Console.WriteLine(matchResult.Groups["value"].Value);
    matchResult = matchResult.NextMatch();
}