不常见的正则表达式

时间:2009-11-13 14:27:45

标签: regex

最近我发现了两个惊人的正则表达式功能:?:?!。我很好奇其他整洁的正则表达式功能。所以也许你想分享一些棘手的正则表达式。

9 个答案:

答案 0 :(得分:12)

我不会称他们为秘密。

如果您认真学习正则表达式,那么(已经提到的)在线资源http://www.regular-expressions.info应该在您的书签中,并且Friedl's Mastering Regular Expressions (Third Edition)应该在您的书架上。

答案 1 :(得分:10)

我认为整个regular-expressions.info网站是一个好的,如果不是那么“秘密”的伎俩。 :)它有advanced页面上的那些。

答案 2 :(得分:6)

您的发现是非捕获组(?:...)和负面预测断言(?!...)。没有任何“秘密”正则表达式技巧,但有许多功能你可能不知道。我建议您仔细阅读perlre

答案 3 :(得分:4)

不是秘密的正则表达技巧,但是很好的推荐是O'Reilly的书“正则表达式食谱”http://www.amazon.com/dp/0596520689

答案 4 :(得分:3)

在发布代码之前测试代码很有帮助。我在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"

有时尝试使用您的代码。测试运行会让您对某个主题有所了解,您会感到惊讶。

答案 5 :(得分:3)

如果您从未查看计算机上安装的docs以及Perl,我想这都是秘密:

开始
$ perldoc perlre

我们其他人不需要在这里发布文档的点点滴滴作为答案。此外,你对这两种模式的解释都是错误的:

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

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

(?!pattern)
  

零宽度负前瞻断言。例如/ foo(?!bar)/匹配任何未出现“bar”的“foo”。但请注意,前瞻和后视不是一回事。

答案 6 :(得分:2)

嗯,由你决定什么是罕见的。获取类似RegexBuddy的程序,其中包含下拉列表,您可以通过指定不同的条件来构建表达式,并查看这些列表中是否存在您之前未听说过的内容=)

您是否知道,您可以命名捕获组?如

 (?<Awesome>.*?)

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

除此之外,我还要补充一点,你的第二个例子是负向前瞻。它说,后面的字符串绝对不能是'狗'。所以“我的狗喜欢绿色的小鸟”是不匹配的。但也许这就是你的意思。我认为这有点不清楚,从阅读你的帖子=)

答案 7 :(得分:1)

在vim中,此行将删除所有XML注释,单行或多行:

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

\_.就像一个匹配换行符的点。 \{-}是非贪婪的明星,如sed。{/ p>中的*?

答案 8 :(得分:1)

不是很秘密,你可以在线测试你的正则表达式