在正则表达式/日食搜索中查找不包含双正斜杠的行

时间:2019-07-01 15:02:57

标签: regex eclipse regex-lookarounds

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

找不到:

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

要找到:

     foo 
    / foobar
       bar foo 
     foobar

我尝试使用负向前瞻/向后搜索和转义/未转义的正斜杠 以下两项都无法在全局搜索中使用,即它们都还返回//行

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

是否存在可以匹配这些行的正则表达式?

2 个答案:

答案 0 :(得分:1)

您可以使用

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

,并替换为//\1。请参见regex demo

这基本上是与

相同的模式(demo
^((?:(?!//).)*?foo.*)

但已展开以提高性能。

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

  • ^((?:(?!//).)*?foo.*)将字符串的开头与^匹配,然后将除换行符(.)之外的其他任何不以//字符序列开头的字符({ {1}})重复0次或更多次,但要重复几次(由于(?!//)),然后匹配*?,而foo则匹配字符串的其余部分
  • .*也匹配字符串的开头,然后^([^/\n]*(?:/(?!/)[^/\n]*)*?foo.*)匹配0个或多个除[^/\n]*和换行符(带有/)之外的字符,以保持在同一行),然后[^/\n]*匹配0个或多个不重复的(?:/(?!/)[^/\n]*)*?重复,再匹配另一个/(请参阅/),然后匹配0个或多个除{{ 1}}和换行符,然后是/(?!/),其余行与/匹配。

答案 1 :(得分:0)

Casimir et Hippolyte的建议非常有用:

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

用于替换日食(即将行设置为注释),我使用 搜索

    search  : (^(?:(?!//).)*?foo.*)
    replace : //\1