【问题标题】:regex negation question正则表达式否定问题
【发布时间】:2009-12-07 22:21:26
【问题描述】:

有谁知道如何编写一个正则表达式(用于类似 grep 的工具),它将搜索单词“vat”但排除单词“private”。我接手了一个项目,该项目有数百个增值税参考(有些是硬编码的,有些不是),由于英国的增值税率在 1 月 1 日发生变化,我需要用正确的税率更新项目源文件。目前,当我在 Visual Studio 中对单词“vat”进行全局搜索时,它还会返回包含私有 void 定义的行。

除此之外,我还需要搜索“15”(当前增值税率),但我想排除任何在“15”之前或之后有任何数字的行。例如,0.15 或 15 或 15% 为真,015 或 150 或 15a 为假。

您可以想象,手动完成这项任务并非易事,因此我们将不胜感激。

谢谢,

提姆

【问题讨论】:

  • 增值税率 (15) 是否有可能发生变化?如果是这样,您是否打算设置一个变量?
  • 不需要复杂的正则表达式。伪代码:如果字符串中的增值税而不是字符串中的 private,则执行某些操作。

标签: c# regex grep regex-negation


【解决方案1】:
/\bVAT\b/

/\b(0\.)?15%?\b/

最后一个允许诸如“0.15%”之类的内容,但这些内容应该足够少,以便以后过滤掉。正则表达式不是最好的工具,那么像“10 + 5”这样的表达式呢?但如果它满足您的需求,它至少易于使用!

【讨论】:

    【解决方案2】:

    使用 Visual Studio(正如我之前读到的那样),您可以使用:

    对于大桶

    ~(pri)vat~(e) (这也将排除 'vate' 所以如果需要,只需取下 ~(e))

    对于 15 岁

    [^0-9a-z]15[^0-9a-z]

    VS 用于查找和替换的正则表达式语法与您的标准正则表达式不同,不确定 MS 为何如此,但他们确实如此。

    【讨论】:

    • 谢谢,这正是我要找的!
    【解决方案3】:

    是的,您可以使用一种称为否定“lookbehind”和“lookahead”的技术,它会匹配一些未跟随其他事物的事物。

    这是一个概述:

    http://www.regular-expressions.info/lookaround.html

    另外,Jeff Atwood 有一篇关于它的博文,可能价值不大:

    http://www.codinghorror.com/blog/archives/000425.html

    【讨论】:

      【解决方案4】:

      你不能搜索“vat”(spacevatspace)吗?

      【讨论】:

      • 不幸的是,这在这种情况下不起作用,因为我正在尝试搜索变量定义,例如可能是“vat_rate”。
      猜你喜欢
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      相关资源
      最近更新 更多