我想在perl regex中替换字符串中双引号内的空格。喜欢如果有一个字符串:
"joe smith" NOT jane "abhi and makie"
和exxcted输出应该是:
"joe~~smith" NOT jane "abhi~~and~~makie"
任何帮助都会受到赞赏。
答案 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"
请注意,此代码假定双引号在输入文本中正确平衡。