2

这是我之前的问题的延续.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

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

我可以处理案例 3 或案例 4,但我无法同时处理这两种情况。

如果我有办法检查捕获组中是否有偶数个''s`,我可以检查我们是否在真正的行尾或文本块中,该行的结尾只是恰好匹配模式。但我不知道如何修改其他示例以处理多个行文本字符串。

我想用一个正则表达式查询来完成还是我被迫进行后处理(使用注释的案例)并且这是两次通过?


这是在 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 =
@"^\(
((('(?<s>.*?)'(?!')) |
 (?<n>-?[\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();
4

1 回答 1

1

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

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

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

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

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

像这样的东西:

(?xm)^
\(

(?:
    (?:
        (?<quote> (?:'[^']*')+ )
    |   (?<num>   -?\d+(?:\.\d+)? )
    |   (?<x>     X'[0-9a-f]*' )
    )
    (?:\s*,\s*)?
)+

\)
[;,] 
\r?$
于 2012-04-05T16:44:07.523 回答