使用以下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? =
进入在线Regex测试时,结果如预期的那样出来,但是在代码中找不到匹配项。 在此部分之前,此处使用的“数据”变量填充有上面提供的文本:
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#中却完全无法运行,所以我不知道如何找出编译器遇到的问题。有什么见解/建议吗?
答案 0 :(得分:2)
大多数在线正则表达式测试器中的行尾仅是LF。如果您在RegexStorm .NET regex测试仪上测试了.NET regex,则由于该行的结尾是CRLF,因此可以更快地发现问题。
因此,(?=\n{2,})
出现了问题,因为它需要换行符重复两次或更多次。由于实际数据中有\r\n
的两个或多个序列,因此您需要用(?=(?:\r\n){2,})
替换该模式部分。
如果您说(?=[\r\n]{3,})
对您有用,则意味着您想匹配一个位置,后跟3个或更多的LF或CR字符。
在混合情况下,如果要匹配后面跟有2个或更多CLF或LF换行符序列的位置,则可以使用(?=(?>\r\n?|\n){2,})
。