代码之家  ›  专栏  ›  技术社区  ›  jantimon

不常见的正则表达式[闭合]

  •  -4
  • jantimon  · 技术社区  · 16 年前

    最近我发现了两个惊人的正则表达式特性: ?: ?! . 我对其他整洁的regex特性很好奇。所以也许你想分享一些复杂的正则表达式。

    9 回复  |  直到 16 年前
        1
  •  12
  •   Bart Kiers    16 年前

    我不会说他们是秘密的。

    如果你是认真学习regex的,那么(已经提到的)在线资源 http://www.regular-expressions.info 应该在你的书签里,而且 Friedl's Mastering Regular Expressions (Third Edition) 应该在你的书架上。

        2
  •  10
  •   unwind    16 年前
        3
  •  6
  •   Michael Carman    16 年前

    你的发现是非捕获组 (?:...) 以及消极的前瞻性断言 (?!...) . 这里没有任何“秘密”的regex技巧,但有许多功能,你可能不知道。我建议你仔细阅读 perlre .

        5
  •  3
  •   PP.    16 年前

    在发布代码之前测试代码会有帮助。我用Perl运行:

    
    if ( "My cat likes green birds" =~ m/My (?!dog) likes .+ / ) {
        print( "Match => \"$1\"\n" );
    } else {
        print( "No match\n" );
    }
    

    它的输出 No match . 另一方面:

    
    if ( "My cat likes green birds" =~ m/My (?!dog)(.+?) likes .+ / ) {
        print( "Match => \"$1\"\n" );
    } else {
        print( "No match\n" );
    }
    

    输出 Match => "cat" .

        6
  •  3
  •   Sinan Ünür    16 年前

    我想如果你从不看 docs 与Perl一起安装在您的计算机上:

    $ perldoc perlre
    

    我们其他人不需要在这里把文件的片段作为答案。此外,你对这两种模式的解释都是错误的:

    # (?:pattern)
    # (?imsx-imsx:pattern)
    

    这是用于集群,而不是捕获;它将子表达式(如“)”分组,但不会像“()”那样进行反向引用。

    (?!pattern)
    

    零宽度否定前瞻断言。例如/foo(?!bar)/匹配“foo”后面没有“bar”的任何匹配项。但是请注意,向前看和向后看不是一回事。

        7
  •  2
  •   Jan Goyvaerts    16 年前

    好吧,你来决定什么是稀有的。得到一个像 RegexBuddy

    你知道吗,比如说,你可以命名捕捉组?例如

     (?<Awesome>.*?)
    

    实际上是用“Awesome”而不是基于零的索引获取的。

    除此之外,我还要补充一点,你的第二个例子是消极展望。上面说后面的字符串肯定不是“dog”。所以“我的狗喜欢绿色的鸟”是不匹配的。但也许这就是你的意思。我看了你的帖子,觉得有点不清楚

        8
  •  1
  •   Ewan Todd    16 年前

    在vim中,这一行将删除所有XML注释,无论是单行还是多行:

    :%s/<!--\_.\{-}-->//g
    

    这个 \_. 就像一个与新行匹配的点。这个 \{-} *? 在sed中。

        9
  •  1
  •   non sequitor    16 年前

    不是那么秘密你可以在网上测试你的正则表达式