-4

我需要用“/”替换所有出现的“////”。

我有以下代码,但它不工作:

$res =~ s/\/\/\/\//\//g;

我究竟做错了什么?

4

2 回答 2

9

许多初学者没有意识到的一件事是您不必使用斜杠作为正则表达式分隔符。在您的情况下,简单地切换到另一个角色会更容易。这避免了所谓的丘陵和山谷影响:

因此,而不是这样:

$res =~ s/\/\/\/\//\//g;

你可以这样做:

$res =~ s#////#/#g;

当正则表达式中涉及斜杠时,通常会使用井号(又名尖号、数字符号或八角形),因为井号在正则表达式语法中没有任何特殊含义,并且通常不会出现在语法中。但是,您几乎可以使用任何您想要的东西。在这种特殊情况下,括号也很好,因为它们不在您的正则表达式中,并且可能更容易阅读:

$res =~ s(////)(/)g;

注意你如何匹配括号。那是(标志开始,也)标志着结束。方括号 ( [...]) 和花括号 ( '{...}' ) 也是如此。只要记住选择一些不在你的正则表达式中的东西。

顺便说一句,您示例中的正则表达式对我有用。也许您在程序中正确和错误地在这里输入了它?您的程序编辑器是否使用语法高亮?

你得到什么错误?你说这行不通。你的意思是它不会编译,或者它不会改变你认为它应该改变的东西?您是否尝试过编写示例程序来查看它是否可以在简化的情况下工作?你有use warningsuse strict在你的程序吗?这些可以帮助找出您可能输入错误的地方。

于 2013-06-24T11:29:18.927 回答
2

您可以使用\K(保留)转义序列和特定量词{3}来简化替换。当然,使用另一个分隔符s///来避免“倾斜牙签综合症”。

$res =~ s#/\K/{3}##g;
于 2013-06-24T10:37:59.260 回答