最近我发现了两个惊人的正则表达式功能:?:
和?!
。我很好奇其他整洁的正则表达式功能。所以也许你想分享一些棘手的正则表达式。
答案 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)
不是很秘密,你可以在线测试你的正则表达式