Linux较少的分页器(或vim)中的负向回顾/提前断言


14

我想在使用的日志中找到所有不包含“ .php”的“索引”实例less/index(?!\.php)不起作用。这可能吗?less和vim的正则表达式是什么(它们有区别吗?)。这些应用程序各自的正则表达式库不可能吗?


Answers:


22

在中vim,您可以这样做:

/index\(\.php\)\@!

有关更多详细信息,请在命令模式下尝试:h \@

\@!     Matches with zero width if the preceding atom does NOT match at the
        current position. /zero-width {not in Vi}
        Like '(?!pattern)" in Perl.
        Example                 matches
        foo\(bar\)\@!           any "foo" not followed by "bar"
        a.\{-}p\@!              "a", "ap", "aap", "app", etc. not immediately
                                followed by a "p"
        if \(\(then\)\@!.\)*$   "if " not followed by "then"

美丽!有什么想法吗?这并非一无是处。我希望正则表达式的行为到处都是PCRE,但事实并非如此。
2014年

7
另请注意negativ lookbehind的语法:\@<!
lanoxx

它跟说你需要把负面看后面的模式之前。示例:\(some\)\@<!thing将匹配thingand everythingnothing,但不匹配something
dwanderson

7

(?!\.php)是perl regexp运算符。less通常使用系统的POSIX regexp API,因此通常在GNU系统上的GNU扩展正则表达式vim使用vim正则表达式。

vim,如已经通过cuonglm所示,相当于index(?!\.php)将是index\(\.php\)\@!\vindex(\.php)@!

对于less,在编译时,您可以选择正则表达式库/ API,然后选择要使用的正则表达式类型:

    --with-regex={auto,gnu,pcre,posix,regcmp,re_comp,
                    regcomp,regcomp-local,none}
        Select a regular expression library  auto

不过,默认情况下,less它将regcomp与REG_EXTENDED一起使用POSIX ,因此您将获得系统的扩展正则表达式,因此通常与相似grep -E

在GNU扩展的正则表达式中,没有等效的后视或前瞻运算符。

您可以用困难的方式做到这一点:

index($|[^.]|\.($|([^p]|p($|([^h]|h($|[^p]))))))

使用less,您可以使用&键过滤出包含index.php&!index\.php)的行,然后搜索index/index)。(您仍然会错过该行的其他实例,index它们也包含在内index.php)。


1
我认为less使用的正则表达式库取决于编译时间。
cuonglm

@Gnouc,你是对的,它似乎现在甚至支持PCRE。
斯特凡Chazelas

是的,我们可以通过解析输出来检查是否less使用。但是与其他图书馆一起,您知道什么检查方法吗?PCREldd $(which less)
cuonglm

1
@Gnouc,它使用来打印正则表达式库的名称less --version
斯特凡Chazelas

我使用Ubuntu 12.04 LTS并与一起使用less --verion,它仅less 444与版权一起打印。
cuonglm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.