【发布时间】:2019-03-30 17:36:18
【问题描述】:
使用以下 RegEx 模式:
(?<comment>(^#{2} [^\r\n]+[\s]+)*)(?:^\[(?:(?<hive>HK(?:LM|[DP]D|C[CUR]|U(SERS|SER|SR|S)))[:])?(?<name>[a-z0-9$][a-z0-9-_]{2,63})\])(?<items>[\S\s]*?)(?=\n{2,})
解析以下文本:
[HKLM:Connection]
AuthKey = 0x8a79b42z67fct29b42e07b3fd78nc540
Url = https://dev.somewebsite.com
ApiPath = /api/
[HKLM:Settings]
AutoMinimizeConsole = no
StyleFile = Default
PhoneNbrs = [+]?[01]{0,3}[-. ]?[(]?[0-9][0-9][0-9][)]?[-. ]?[0-9][0-9][0-9][-. ]?[0-9][0-9][0-9][0-9]
PostalCodes = [ABCEGHJKLMNPRSTVXYabceghjklmnprstvxy][0-9][ABCEGHJKLMNPRSTVWXYZabceghjklmnprstvwxyz][\s.-]?[0-9][ABCEGHJKLMNPRSTVWXYZabceghjklmnprstvwxyz][0-9]
[HKLM:Font-Mapping]
MonoSpaced = Courier New
User1 = Software Tester 7
User2 = Repetition Scrolling
User3 = basis333
[HKLM:UserInterface]
[HKCU:UserInterface]
[HKCU:Credentials]
Username =
Password? =
当输入在线正则表达式测试时,结果如预期一样,但在代码中,找不到匹配项。 此处使用的“数据”变量在此段之前使用上面提供的文本填充:
public const string GROUP_PATTERN = @"(?<comment>(^#{2} [^\r\n]+[\s]+)*)(?:^\[(?:(?<hive>HK(?:LM|[DP]D|C[CUR]|U(SERS|SER|SR|S)))[:])?(?<name>[a-z0-9$][a-z0-9-_]{2,63})\])(?<items>[\S\s]*?)(?=\n{2,})";
Regex groupParser = new Regex(GROUP_PATTERN, RegexOptions.Compiled | RegexOptions.ExplicitCapture | RegexOptions.IgnoreCase | RegexOptions.Multiline);
MatchCollection matches = groupParser.Matches(data);
foreach (Match m in matches)
this.Add(IniGroupItem.Parse(m.Value));
在 ForEach 开始时,匹配项为零(应该是六个!)..
由于该模式在测试站点上有效,但在 c# 中完全无效,我不知道如何找出编译器遇到的问题。有什么见解/建议吗?
【问题讨论】:
-
您的文件似乎有 CRLF 结尾,请尝试将
(?=\n{2,})替换为(?=(?:\r\n){2,}) -
doh! -- 好吧,我把 "(?=\n{2,})" 替换为 "(?=[\r\n]{3,})" ,它按预期工作!如果您将其发布为答案,我会给您功劳! :)