Regex 带感叹号的Perl正则表达式

Regex 带感叹号的Perl正则表达式,regex,perl,Regex,Perl,如何定义/解释此Perl正则表达式: $para =~ s!//!/!g; 我知道s表示搜索,g表示全局(搜索),但不知道感叹号是怎么回事和额外的斜杠/适合(因为我认为模式看起来更像s/abc/def/g)。Perl的正则表达式操作符s,m和tr(虽然它不是真正的正则表达式操作符)允许您使用任何符号作为分隔符 这意味着你不必使用你可以使用的/,就像你的问题 # the regex s!//!/!g 表示搜索所有'/'实例并将其替换为'/' 你可以写和我一样的东西 s/\/\//\/g 或

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

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

我知道
s
表示搜索,
g
表示全局(搜索),但不知道感叹号
是怎么回事
和额外的斜杠
/
适合(因为我认为模式看起来更像
s/abc/def/g
)。

Perl的正则表达式操作符
s
m
tr
(虽然它不是真正的正则表达式操作符)允许您使用任何符号作为分隔符

这意味着你不必使用你可以使用的
/
,就像你的问题

# the regex
s!//!/!g
表示搜索所有
'/'
实例并将其替换为
'/'

你可以写和我一样的东西

s/\/\//\/g 

如果你真的想要,但正如你所看到的第一个,所有的反斜杠,是很难理解和更麻烦

更多信息可以在

中找到,替换正则表达式(和其他正则表达式操作符,如
m//
)可以使用任何标点字符作为分隔符。这就省去了在正则表达式中转义元字符的麻烦

如果要替换斜杠,则编写以下内容会很尴尬:

s/\/\//\//g;
这就是你能写作的原因

s!//!/!g; 
…相反。看


不,
s//
是替代
m//
是搜索,尽管我确实相信预期的助记符是“匹配”。

感叹号是分隔符;perl允许您在合理的范围内选择所需的任何字符。该语句相当于(更加丑陋的)
s/\/\/\/\///g
——也就是说,它将
//
替换为
/

,而不仅仅限于那些合理的字符。您可以使用任何
[^\s\w]
字符作为分隔符。如果它是四种ASCII开括号类型之一,则相应的闭式版本为mate;否则就是同一个角色完成的。有很多不合理但合法的选择。没有人会感谢你选择了
索利多金币,也不会感谢你选择了
分号。
s/\/\//\//g;
s!//!/!g;