带感叹号的Perl正则表达式

时间:2012-02-16 03:12:41

标签: regex perl

如何定义/解释此Perl正则表达式:

$para =~ s!//!/!g;

我知道s表示搜索,g表示全局(搜索),但不确定感叹号!和额外斜杠/如何适合(如我认为该模式看起来更像s/abc/def/g)。

3 个答案:

答案 0 :(得分:10)

Perl的正则表达式运算符smtr(认为它不是真正的正则表达式运算符)允许您使用任何符号作为分隔符。

这意味着您不必使用/可以使用!

# the regex
s!//!/!g

表示使用'//'

搜索并替换'/'的所有实例

你可以写与

相同的东西
s/\/\//\/g 

s#//#/#g

s{//}{/}g

如果你真的想要,但你可以看到第一个带有所有反斜杠,很难理解,而且更加麻烦。

可以在perldoc's perlre

中找到更多信息

答案 1 :(得分:4)

替换正则表达式(以及其他正则表达式运算符,如m///)可以将任何标点字符作为分隔符。这样可以省去在正则表达式中转义元字符的麻烦。

如果你想替换斜杠,写下来会很尴尬:

s/\/\//\//g;

这就是为什么你可以写

s!//!/!g; 

...来代替。见http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators

不,s///是替代品。 m///是搜索,但我确实认为预期的助记符是“匹配”。

答案 2 :(得分:1)

感叹号是分隔符; perl让你在合理的范围内选择你想要的任何角色。该陈述等同于(更加丑陋)s/\/\//\//g - 也就是说,它将//替换为/