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?$