【问题标题】:Perl regex: find second underscore and replace with a colon within a stringPerl 正则表达式:在字符串中查找第二个下划线并用冒号替换
【发布时间】:2016-07-24 18:18:35
【问题描述】:

我在这个让我发疯的正则表达式上寻求你的智慧。

我想用冒号替换第二个下划线。就是这样。

到目前为止:

    my $str = "bythepower_of_grayskull";
    $str =~ s/.*?_.*?(_)/:/g;
    print "$str\n";

当前输出::grayskull

所需输出:bythepower_of:grayskull

【问题讨论】:

  • 字符串中是否只有两个 _ 或者可能超过两个?很少有其他示例有助于澄清。
  • 谢谢提问。总共只有两个下划线。只有第二个下划线我需要替换冒号

标签: regex string perl search replace


【解决方案1】:

您需要将捕获组放在要保留的部分周围,而不是要替换的部分。然后在替换中使用$1 复制捕获的文本。

$str =~ s/(.*?_.*?)_/$1:/;

如果只有 2 个下划线,则不需要 g 修饰符,因为只需替换一个。

【讨论】:

  • 太棒了。上面的信息加上这个小sn-p让一切都清楚了。非常感谢!
【解决方案2】:

你只需要

$str =~ s/.*\K_/:/;

【讨论】:

  • 谢谢,这个答案对我很有帮助:)
【解决方案3】:

您可以捕获first underscore + some string 然后second underscore 的出现并相应地替换。

解决方案 #1

正则表达式: (_.*?)_

说明:

  • (_.*) 匹配第一个下划线和一些字符串。

  • (_) 匹配第二个下划线。

替换为:替换为\1:

Regex101 Demo


解决方案 #2

正则表达式: _([^_]*$)

说明:由于您的字符串只有 两个 下划线,因此此正则表达式将捕获字符串末尾的 第一个

  • _ 匹配字符串末尾的第一个下划线。 (倒数第二个。)

  • ([^_]*$) 匹配字符串的其余部分直到结束。

替换为:替换为:\1

Regex101 Demo


解决方案 #3

您也可以使用positive lookahead。这是对Solution #2 的一点修改。在这里您唯一需要做的就是提前查找 rest of the string 而不是捕获它。

正则表达式: _(?=[^_]*$)

说明:

  • _ 与下划线匹配后,它会先行查找直到字符串末尾不存在下划线。因此,数学上第二个下划线将被匹配。

替换为:替换为:

Regex101 Demo

【讨论】:

  • 第二个捕获组是干什么用的?
  • @Barmar:添加了解释。
  • 我没看到。为什么下划线周围需要一个捕获组?你没有在任何地方使用\2
  • @Barmar:哦,是的,你是对的。那是个愚蠢的错误。一开始我以为我可以换掉它。
  • 非常感谢您的信息。它让我尝试了一些不同的东西。就是这样。
【解决方案4】:

不要将 g 修饰符仅用于一次替换:

$str =~ s/_[^_]*\K_/:/;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    相关资源
    最近更新 更多