我正在计划一个简单的配置文件布局,如
# commentary line
setting1 = some string
setting2 = 123
setting3=whatever
现在我想编写一个能够读取该配置文件的正则表达式(在C#.NET中)。我的尝试是
!(\#)(.*)\s=\s(.*)
我的目标是
!(\#)
)\s=\s
)这是正确的还是我做错了,如果错了,怎么办呢?
答案 0 :(得分:2)
名称值对并不复杂。没有必要在其中加入正则表达式。您所需要的只是文件中行的foreach循环(无论如何)。然后一个简单的if statment检查该行不以a开头 注释指示符,然后基于等于拆分字符串。正则表达式很酷,但有时它们会使事情变得更复杂。现在你有两个问题。
答案 1 :(得分:0)
试试这个:
^([a-zA-Z_]\w*)\s*=\s*([^#]+?)$
这适用于可能由字母,数字和_组成的名称(并且不能以数字开头)。标记'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线?