【发布时间】:2012-02-16 11:35:12
【问题描述】:
你如何定义/解释这个 Perl 正则表达式:
$para =~ s!//!/!g;
我知道 s 表示搜索,g 表示全局(搜索),但不确定感叹号 ! 和额外的斜杠 / 是如何适应的(因为我认为模式看起来更像s/abc/def/g)。
【问题讨论】:
你如何定义/解释这个 Perl 正则表达式:
$para =~ s!//!/!g;
我知道 s 表示搜索,g 表示全局(搜索),但不确定感叹号 ! 和额外的斜杠 / 是如何适应的(因为我认为模式看起来更像s/abc/def/g)。
【问题讨论】:
Perl 的正则表达式运算符s、m 和tr(认为它不是真正的正则表达式运算符)允许您使用任何符号作为分隔符。
这意味着你不必使用你可以使用的/,就像你的问题!
# the regex
s!//!/!g
表示搜索并用'/'替换'//'的所有实例
你可以写和
一样的东西s/\/\//\/g
或
s#//#/#g
或
s{//}{/}g
如果你真的想要,但是你可以看到第一个带有所有反斜杠的,非常难以理解并且更麻烦。
更多信息可以在perldoc's perlre找到
【讨论】:
替换正则表达式(和其他正则表达式运算符,如m///)可以将任何标点符号作为分隔符。这省去了在正则表达式中转义元字符的麻烦。
如果你想替换斜线,写起来会很尴尬:
s/\/\//\//g;
这就是为什么你可以写作
s!//!/!g;
...相反。见http://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators
不,s/// 是替代品。 m/// 是搜索,尽管我相信预期的助记符是“匹配”。
【讨论】:
感叹号是分隔符; perl 允许您在合理的范围内选择您想要的任何字符。该语句等效于(更丑陋的)s/\/\//\//g——也就是说,它将// 替换为/。
【讨论】:
[^\s\w] 字符作为分隔符。如果是四种 ASCII 开括号类型之一,则对应的关闭版本是 mate;否则就是同一个角色完成它。有很多不合理但合法的选择。没有人会感谢您选择REVERSE SOLIDUS,也不会感谢您选择SEMICOLON。