这种替代有什么问题?

时间:2010-06-02 12:27:13

标签: regex perl substitution

#!/usr/bin/perl

use strict;
use warnings;

my $s = "sad day
 Good day
 May be Bad Day 
 ";

$s =~ s/\w+ \w+/_/gm;

print $s;

我试图用_替换单词之间的所有空格,但它不起作用。这有什么问题?

3 个答案:

答案 0 :(得分:5)

替换替换整个单词(\w+)然后替换空格,然后用下划线替换另一个单词。

实际上没有必要替换(或捕捉重要的)这些词

$a=~s/\b +\b/_/gm;

将替换单词中断(\b,单词和非单词之间的零宽度过渡),后跟一个或多个空格,后跟另一个单词中断,下划线。使用\b可确保您不会在新行之后或之前替换空格。

答案 1 :(得分:3)

这种模式替换可能是最有效的解决方案:

$a =~ s/\b \b/_/g;

答案 2 :(得分:2)

如果没有明确look-ahead and look-behind assertions的答案:

,这个问题就不会完整
$s =~ s/(?<=\w) (?=\w+)/_/g
  • 这实际上与涉及零宽度字边界锚\b的解决方案相同。

  • 请注意,前瞻性正则表达式可以匹配任何字符长度的正则表达式,但是后瞻性正则表达式必须是固定长度的(这就是为什么(?<=\w+)无法完成的原因)。