【问题标题】:Attempt to replace "////" with "/" is not working尝试用“/”替换“////”不起作用
【发布时间】:2013-06-20 19:49:24
【问题描述】:

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

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

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

我做错了什么?

【问题讨论】:

  • 不确定这在 perl 中是否可行,但不妨试试s_////_/_g
  • 它对我有用,用一个替换 4 个斜线。您的问题很可能在于您未显示的其他代码。
  • 我将其替换为 $res =~ s|////|/|g;
  • 另外,永远,永远不要说"Its not working"而不描述如何。
  • 请使用 $res =~ s|[/]{4}|/|g 之类的名称。这 4 个斜线很难读。

标签: string perl replace


【解决方案1】:

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

因此,而不是这样:

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

你可以这样做:

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

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

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

注意你如何匹配括号。即( 标志着开始,) 标志着结束。方括号 ([...]) 和花括号 ('{...}') 也是如此。请记住选择一些尚未包含在正则表达式中的内容。

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

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

【讨论】:

  • 我没听说过它叫hills and valleys,我喜欢那个。我听说leaning toothpicks 虽然是描述性的,但似乎不切实际:-)
【解决方案2】:

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

$res =~ s#/\K/{3}##g;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 2018-05-02
    • 2018-04-27
    • 2018-03-15
    • 2015-02-21
    相关资源
    最近更新 更多