用于选择文本的正则表达式

时间:2012-06-21 16:36:48

标签: c# regex string text quotes

我需要选择带双引号的文本,双引号的数量必须可以除以2或0。 示例输入:

Starting
blahaapvi "Starting + Ending"
asfg "Ending"
Ending

我现在有这个:Starting(.*)Ending ...但我不想匹配引号中的文字。有人请帮助我。

2 个答案:

答案 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 );

}

}