不在一组引号内时匹配正则表达式模式(文本跨越多行)

这是我之前的问题的延续.NET正则表达式引擎没有返回匹配,但我期待8 。

我的查询是完美处理所有内容,我的捕获组工作得很好,但是我找到了一个我不知道如何处理的边缘情况。

这是一个我遇到问题的测试用例 。

INSERT INTO [Example] ( [CaseNumber] , [TestText] ) VALUES (1 , 'Single Line Case'), (2 , 'Multi Line Case'); (3 , 'Two Lines with odd end ''); Case'); (4 , ''), (5 , 'Case 3 is the Empty Text Case'); 

这是我正在使用的模式,我使用RegexOptions标志Singleline, MultilineExplicitCaptureIgnorePatternWhitespace

 ^\( ((('(?.*?)'(?!')) | (?-?[\d\.]+) )(\s,\s)? )+ #(?<!'') #Commented Case 3 works, un-commented case 2 works \)[;,]\r?$ 

我可以处理案例3或案例4,但我无法处理两者。

如果我有办法检查是否存在偶数个'捕获组’中的’我可以检查然后看看我们是在一个真正的行尾或文本块中有一行结束那个恰好匹配模式。 但我无法弄清楚如何修改其他示例来处理多个带衬里的文本字符串。

可以使用单个正则表达式查询完成我想要的操作,还是我被迫进行后期处理(使用注释的情况)并执行此操作是两次通过?


以下是在LINQPad中运行它的代码

 string text = @"INSERT INTO [Example] ( [CaseNumber] , [TestText] ) VALUES (1 , 'Single Line Case'), (2 , 'Multi Line Case'); (3 , 'Two Lines with odd end ''); Case'); (4 , ''), (5 , 'Case 3 is the Empty Text Case'); "; const string recordRegex = @"^\( ((('(?.*?)'(?!')) | (?-?[\d\.]+) )(\s,\s)? )+ #(?<!'') #Commented Case 3 works, un-commented case 2 works \)[;,]\r?$"; var records = Regex.Matches(text, recordRegex, RegexOptions.Singleline | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace | RegexOptions.ExplicitCapture); records.Dump(); 

像这样的表达式会匹配这样的引号:

 (?:'[^']*')+ 

如果你想匹配foo当它不在这样的引号内时,你可以使用类似的东西:

 foo(?=[^']*(?:'[^']*'[^']*)+\z) 

每行一个匹配,未加引号的文本和数字作为捕获组

像这样的东西:

 (?xm)^ \( (?: (?: (? (?:'[^']*')+ ) | (? -?\d+(?:\.\d+)? ) | (? X'[0-9a-f]*' ) ) (?:\s*,\s*)? )+ \) [;,] \r?$