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

C# 不在一组引号内时匹配正则表达式模式(文本跨多行),c#,.net,regex,C#,.net,Regex,这是我上一个问题的继续 我的查询处理得非常完美,我的捕获组工作得非常好,但是我发现了一个边缘案例,我不知道如何处理 我有麻烦了 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 Empt

这是我上一个问题的继续

我的查询处理得非常完美,我的捕获组工作得非常好,但是我发现了一个边缘案例,我不知道如何处理

我有麻烦了

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标志
单线
多线
显式密码
,和
忽略模式空白

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

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

(?:'[^']*')+
如果您想匹配
foo
,而它不在这样的引号内,您可以使用如下内容:

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

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

大概是这样的:

(?xm)^
\(

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

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

这里的引用语法是什么?我不明白
'foo'
是如何有效的。@Qtax您是正确的,但是
'foo'\r\nbar'
是有效的。啊,是的,我没有看太多下面这行,语法突出显示欺骗了我。这是什么
X'123'
语法?这是MS SQL中的特殊引用吗?这是什么意思?@Qtax我从中获取文本的位置是将二进制值格式化为
X'[0-9a-f]+'
,而不是普通的
0x[0-9a-f]+
,但是因为我不需要
0x
X'
我只捕获十六进制值。我本想从这个示例中删除它,因为它不相关。我将模式的最后一行更改为
\)[;,](?=[^']*(?:“[^']*”[^']*)+\z)\r?$
。它现在匹配3和4,但现在无法捕获5。@ScottChamberlain,我不完全理解这个问题,你想要这个表达式做什么?按照我在问题中发布到regex hero网站的链接,它每行应该有一个匹配项,并将不带引号的文本和数字作为捕获组。
(?xm)^
\(

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

\)
[;,] 
\r?$