ReplaceAll中的正则表达式

时间:2016-02-01 10:00:09

标签: c# visual-studio-2012

我需要一个正则表达式,可以搜索未包含在单引号或双引号内的特定子字符串。 示例,如果我需要搜索"查询"在下面的文字中

这是一个非常好的查询, 但是我们不需要这个"报价错误的查询"这个'单个查询报价'。 我需要的是完美的queryexpression,可以解决我的问题。

然后我应该得到理想的结果as-> 查询,即在好词和 queryexpression之前

1 个答案:

答案 0 :(得分:0)

使用正则表达式很难解决这个问题。它可能看起来很简单,您可以选择一个正如您创建的正则表达式,考虑到在引用之前可能还有其他文本的事实(如果正则表达式引擎支持可变宽度环视): / p>

 (?<!"[^"])query(?![^"]*")|(?<!'[^'])query(?![^']*')

但是对于像

这样的文字会失败
  

这是一段引用查询的“引用文本”,特别是在跟随它的时候“

由于Look后面将检测引用文本的结束引用,作为查询一词的可能引用的一部分。

当Query在两段缩写文本之间时会出现类似的问题:

  

当您不知道数据时很难知道查询何时不返回任何值。

如果您使用C#,您可以使用平衡组的概念,但由于您不是,并且Javascript不支持该构造,您最终会遇到这样的情况:满足您的搜索条件,而不使用比正则表达式更先进的技术。

通过大量调整,您可能能够检测到大多数情况,但是一个万无一失的解决方案几乎是不可能的。特别是当限于Javascript支持的正则表达式功能时。具有可变长度环视的正则表达式引擎以及对平衡组或递归的支持使您可以更近,请参阅this article for an example of matching opening and closing quotes

@"
(?>
    "\b (?<DEPTH> )
    |
    \b" (?<-DEPTH> )
    |
    [^"]*
)*
(?(DEPTH)(?!))
"

虽然对于像

这样的其他有趣案例仍然会失败
  

在某些情况下,双引号字符(“)用于查询中的错误位置,例如:'select test from” table'