配置文件的正则表达式

时间:2011-04-10 16:01:14

标签: c# regex configuration

我正在计划一个简单的配置文件布局,如

# commentary line
setting1 = some string
setting2 = 123
setting3=whatever

现在我想编写一个能够读取该配置文件的正则表达式(在C#.NET中)。我的尝试是

!(\#)(.*)\s=\s(.*)

我的目标是

  • 忽略评论的行(!(\#)
  • 将格式保留给用户(\s=\s

这是正确的还是我做错了,如果错了,怎么办呢?

4 个答案:

答案 0 :(得分:2)

名称值对并不复杂。没有必要在其中加入正则表达式。您所需要的只是文件中行的foreach循环(无论如何)。然后一个简单的if statment检查该行不以a开头 注释指示符,然后基于等于拆分字符串。正则表达式很酷,但有时它们会使事情变得更复杂。现在你有两个问题。

答案 1 :(得分:0)

试试这个:

^([a-zA-Z_]\w*)\s*=\s*([^#]+?)$

enter image description here

这适用于可能由字母,数字和_组成的名称(并且不能以数字开头)。标记'm'(乘以行)是必需的(对于^和$ work)

P.S.I've试过JS在线正则表达式评估器 - 但我认为正则表达式在C#中是相同的(可能会有一些改变)

P.P.S。 我在C#中看到你可以给正则表达式中的组匹配名称。我发现了一些C#代码,它们做了类似的事情(你需要什么 - 我认为):(这是另一个正则表达式 - 使用其他名称规则而没有#comlection支持 - 你应该将正则表达式更改为你的)

    Regex re = new Regex(@"(?<key>^[a-zA-Z_][\w]*)\s*=\s*(?<value>\w+$)",
RegexOptions.IgnoreCase);

    Match match = re.Matches(str)[0];
    // get pair from line
    string option_name = match.Groups["key"].Value;
    string option_value = match.Groups["value"].Value;

答案 2 :(得分:0)

如果你坚持使用正则表达式,那么这个应该完成这项工作:

^([^#][^\s=]+(?:\s+[^\s=]+))\s*=\s*(.*)

它不会匹配以#开头的任何行。如果它匹配,则第一个匹配组将是名称(没有尾随空格 - 这就是嵌套的非捕获组的用途;我认为我已正确优化它以防止回溯)。第二个匹配组将是值,不带前导空格。

我认为这应符合你的标准,即“基本上可以是任何东西”;它应匹配除尾随空格和=之外的任何内容。它应匹配任何值,包括包含=的值。但我没有对此进行测试以确认边缘情况,因此请务必编写大量单元测试,以确保它能够在各种输入下正常工作。

当然,请注意,这比doing the string parsing directly更慢,更复杂。

答案 3 :(得分:0)

试试这样:  ^ \ S *(?:?([^#\ S =] +)\ S * = \ S *([^#] +)(#))|(#)$ 如果确实';匹配行无效 - &gt;配置文件中的错误。 第1和第2匹配组 - &gt;键 - &gt;值 在价值结束时切出空白 线路通信的第3端 第4条整线通讯网 什么与blak线?

相关问题