用字符串perl regex中的双引号替换空格~~

时间:2013-08-12 11:40:13

标签: regex perl

我想在perl regex中替换字符串中双引号内的空格。喜欢如果有一个字符串:

"joe smith" NOT jane "abhi and makie"

和exxcted输出应该是:

"joe~~smith" NOT jane "abhi~~and~~makie"

任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:1)

我知道做这种事情的最简单方法是使用m/.../g迭代目标字符串的所有相关子字符串。然后将@-@+内置数组与substr一起用作左值来修改这些子字符串。

此代码演示

use strict;
use warnings;

my $str = q{"joe smith" NOT jane "abhi and makie"};

print $str, "\n";

while ( $str =~ /"[^"]+"/g ) {
  substr($str, $-[0], $+[0] - $-[0]) =~ s/\s+/~~/g;
}

print $str, "\n";

<强>输出

"joe smith" NOT jane "abhi and makie"
"joe~~smith" NOT jane "abhi~~and~~makie"

答案 1 :(得分:0)

假设您没有转义引号并且它们都已配对:

$s='"joe smith" NOT jane "abhi and makie"';
$s =~ s/ (?=[^"]*"(?:[^"]*"[^"]*")*[^"]*$)/~~/g;
print $s, "\n";

答案 2 :(得分:0)

e命令的s///后缀允许在替换文本中使用代码。在下面的代码中,s!!!会在双引号中找到名称,然后传递为$1。替换部件中的代码将$1保存到$aa,因为$1是只读的,因此无法修改。内部s///用波浪号替换空格。最终$aa返回替换文本。最后的g使s!!!适用于该行上每个双引号文本。

use strict;
use warnings;

while ( <DATA> ) {
    s!("[^"]*")! my $aa = $1; $aa =~ s/ /~~/g; $aa !eg;
    print;
}

__DATA__
"joe smith" NOT jane "abhi and makie"

请注意,此代码假定双引号在输入文本中正确平衡。