【问题标题】:Regex for selecting text用于选择文本的正则表达式
【发布时间】:2012-06-23 22:58:41
【问题描述】:

我需要选择带双引号的文本,并且双引号的数量必须能被 2 或零整除。 示例输入:

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

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

【问题讨论】:

  • 当你说“引号”时,你的意思是双引号吗?
  • 能否请您指定应该被二整除的计数。
  • 其实有一个非常好的正则表达式资源:regexpal.com,在那里你可以尝试表达式。

标签: c# regex string text quotes


【解决方案1】:

试试这个找到有平衡双引号的文本

^Starting([^"]*"(?<txt>[^"]*)"[^"]*)*Ending$

这里是解释

^Starting正文开头的图案。

[^"]*         任意数量的字符,不包括双引号。

"(?&lt;txt&gt;[^"]*)" 在名为“txt”的捕获中捕获的双引号中包含的文本。

[^"]*         同样是任意数量的字符,不包括双引号。

(...)*       任意数量的重复文本,可能包含双引号中的文本。

Ending$     文本末尾的模式。

【讨论】:

  • 不,对于有点不清楚的问题,我很抱歉。我会编辑它。这是双引号的计数......它已被编辑。
【解决方案2】:

试试这个

(已编辑以允许文本中的新行)

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

}

}

【讨论】:

  • Multiline 修饰符不正确。它所做的只是改变锚点(^$)的含义,使它们匹配任何 的开头和结尾,而不仅仅是输入的开头和结尾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 1970-01-01
相关资源
最近更新 更多