首页 > 解决方案 > 在正则表达式/日食搜索中查找不包含双斜杠的行

问题描述

在 Eclipse 中仅搜索包含 'foo' 的未注释行时,我也会收到注释行。

找不到:

    // foo 
    // foobar
        // foo 
     // foobar
    // // foobar
     bar // foobar

被发现:

     foo 
    / foobar
       bar foo 
     foobar

我尝试了负前瞻/后视和转义/未转义的正斜杠,以下都不适用于全局搜索,即它们都返回 // 行

    ^.*(?!//).*foo.*$
    ^.*(?<!\/\/).*foo.*$

是否有一个有效的正则表达式来匹配这些行?

标签: regexeclipseregex-lookarounds

解决方案


您可以使用

^([^/\n]*(?:/(?!/)[^/\n]*)*?foo.*)

并替换为//\1. 请参阅正则表达式演示

这与模式(演示)基本相同

^((?:(?!//).)*?foo.*)

但为了获得更好的性能而展开。

看看这些模式是如何工作的:

  • ^((?:(?!//).)*?foo.*)将字符串的开头与 匹配^,然后除换行符 char ( .) 以外的任何不以//字符序列 ( (?!//)) 开头的字符重复 0 次或多次,但尽可能少地重复(由于*?),然后匹配foo.*匹配字符串的其余部分
  • ^([^/\n]*(?:/(?!/)[^/\n]*)*?foo.*)还匹配字符串的开头,然后匹配除和换行符以外的[^/\n]*0 个或多个字符(用, 保持在同一行),然后匹配 0 个或多个不跟随的序列的重复(参见),然后是 0或除和换行符以外的更多字符,然后和行的其余部分与./[^/\n]*(?:/(?!/)[^/\n]*)*?///(?!/)/foofoo.*

推荐阅读