我需要选择带双引号的文本,双引号的数量必须可以除以2或0。 示例输入:
Starting
blahaapvi "Starting + Ending"
asfg "Ending"
Ending
我现在有这个:Starting(.*)Ending
...但我不想匹配引号中的文字。有人请帮助我。
答案 0 :(得分:0)
尝试此操作以查找具有均衡双引号的文本
^Starting([^"]*"(?<txt>[^"]*)"[^"]*)*Ending$
以下是解释
^Starting
文本开头的模式。
[^"]*
任意数量的字符,不包括双引号。
"(?<txt>[^"]*)"
包含在名为“txt”的捕获中捕获的双引号中的文本。
[^"]*
任意数量的字符不包括双引号。
(...)*
可能包含双引号文本的任意数量的文本重复。
Ending$
文本最后的模式。
答案 1 :(得分:0)
试试这个
(编辑为允许文本中的新行)
static void Main(string[] args) {
string l_input1 = "match \"text\" with \r\n even \"quotes\"";
string l_input2 = "unmatch \"text\" with \r\n uneven quotes\"";
string l_pattern = @"^(?>([^""]*?((?<QUOTE>"")[^""]*(?<-QUOTE>"")?))*)$(?(QUOTE)(?!))";
bool l_isMatch1 = Regex.IsMatch( l_input1, l_pattern );
bool l_isMatch2 = Regex.IsMatch( l_input2, l_pattern );
Console.WriteLine( l_isMatch1 );
Console.WriteLine( l_isMatch2 );
Console.ReadKey( true );
}
说明:
^(?>([^"]*?((?<QUOTE>")[^"]*(?<-QUOTE>")?))*)$(?(QUOTE)(?!))
这将尝试从输入(^)的开头到结尾($)匹配,以防止它在最后的奇数双引号之后忽略文本。
基本思想是在1匹配和0匹配之间切换QUOTE命名组堆栈。因此,正则表达式将从匹配0个或更多非双引号字符([^“] *?)开始。如果找到双引号,则将其添加到命名组(名为”QUOTE“)堆栈并继续匹配0或者更多非双引号字符。如果它找到第二个双引号,它将删除添加到“QUOTE”堆栈的最后一个匹配(因此堆栈将包含0个匹配),然后重复回到开头。
在字符串结束后,有一个条件分组器。条件是如果已将1个或多个匹配项添加到命名组“QUOTES”,则执行零长度否定预测(这将始终导致正则表达式失败)。这将确保,如果未找到第二个引用(从而清除“QUOTES”堆栈),则整个正则表达式失败。
编辑:
如果您确实要捕获引用的文本,请使用:
static void Main(string[] args) {
string l_input1 = "match \"text\" with \r\n even \"quotes\"";
string l_input2 = "unmatch \"text\" with \r\n uneven quotes\"";
string l_pattern = @"^(?>([^""]*?(?<QUOTED_TEXT>(?<QUOTE>"")[^""]*(?<-QUOTE>"")?))*)$(?(QUOTE)(?!))";
Match l_match1 = Regex.Match( l_input1, l_pattern );
Match l_match2 = Regex.Match( l_input2, l_pattern );
Console.WriteLine( l_match1.Success );
foreach ( Capture l_quotedText in l_match1.Groups["QUOTED_TEXT"].Captures ) {
Console.WriteLine( l_quotedText.Value );
}
Console.WriteLine( l_match2.Success );
Console.ReadKey( true );
}
}