C#/ Regex模式可用于在线测试,但不能在运行时

时间:2019-03-30 17:36:18

标签: c# regex

使用以下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#中却完全无法运行,所以我不知道如何找出编译器遇到的问题。有什么见解/建议吗?

1 个答案:

答案 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,})