如何用括号替换双引号?

时间:2014-11-21 10:30:11

标签: regex perl

我需要找到双引号的每个单词并将qoutes替换为括号,因为perl在sybase iq中执行字符串时会发现语法错误,如果代码中有双qoutes。例如:

"test", "default", "left","right"

我想替换看起来像这样

[test], [default], [left],[right]

这是我走了多远:

 $arr_tab[$i] =~ s/"\w+"/[$0]/g;

\w+找到字符串中的所有“字词”并将其替换为[test],我不知道如何将搜索结果写入$0并通过它进行删除以使其成为适当替换每个发现。

2 个答案:

答案 0 :(得分:2)

这看起来像一个适合Text::ParseWords的工作,这是Perl 5中的核心模块。

use strict;
use warnings;
use Text::ParseWords;

while (<DATA>) {
    chomp;
    print join ", ", map "[$_]", quotewords('\s*,\s*',0,$_);
}

__DATA__
"test", "default", "left","right"

输出是:

[test], [default], [left], [right]

说明:

quotewords子例程解析字符串,并在逗号上将其与可选的周围空格分开。它还会删除引号,因为我将“keep”选项设置为零0。然后,我们可以使用map语句将括号应用于生成的单词列表。最后,我们将它与逗号和打印一起加入。

答案 1 :(得分:0)

你可以简单地使用捕获组并使用[^"]来匹配"之外的任何角色,如果你使用\w,它只会匹配单词字符并赢得&# 39;如果双引号内存在非单词字符,则无效。

s/"([^"]*)"/[$1]/g;

示例:

use strict;
use warnings;
my $string = '"test", "default", "left","right"';
$string =~ s/"([^"]*)"/[$1]/g;
print "$string\n";

输出:

[test], [default], [left],[right]