Regex 在Perl中,如何删除所有不在双引号内的空格&引用;?
我想用一些正则表达式来删除字符串中的所有空格字符,只要它不在双引号(“)内 示例字符串: 某些字符串带有“引号中的文本” 结果: somestringwith“引号中的文本” 到目前为止,我已经想出了这样的办法:Regex 在Perl中,如何删除所有不在双引号内的空格&引用;?,regex,perl,Regex,Perl,我想用一些正则表达式来删除字符串中的所有空格字符,只要它不在双引号(“)内 示例字符串: 某些字符串带有“引号中的文本” 结果: somestringwith“引号中的文本” 到目前为止,我已经想出了这样的办法: $str =~ /"[^"]+"|/g; 但它似乎没有达到预期的效果 老实说,我对perl非常陌生,没有太多的regexp经验。因此,如果有人愿意回答,我也愿意提供一些关于为什么以及如何回答的见解,那将非常好 谢谢 编辑 字符串将不包含转义的“'s” 实际上,它的格式应始终如
$str =~ /"[^"]+"|/g;
但它似乎没有达到预期的效果
老实说,我对perl非常陌生,没有太多的regexp经验。因此,如果有人愿意回答,我也愿意提供一些关于为什么以及如何回答的见解,那将非常好
谢谢
编辑
字符串将不包含转义的“'s”
实际上,它的格式应始终如下所示:
$str =~ /"[^"]+"|/g;
Some.String=“Some Value”
结果将是
Some.String=“Some Value”下面是一种使用
拆分
来分离引用字符串的技术。它依赖于你的数据是一致的,不会与松散的报价
use strict;
use warnings;
my @line = split /("[^"]*")/;
for (@line) {
unless (/^"/) {
s/[ \t]+//g;
}
}
print @line; # line is altered
基本上,分割字符串是为了隔离带引号的字符串。完成后,对所有其他字符串执行替换。由于数组元素在循环中具有别名,因此会对实际数组执行替换
您可以按如下方式运行此脚本:
perl -n script.pl inputfile
查看输出。或
perl -n -i.bak script.pl inputfile
在inputfile
上进行就地编辑,同时在inputfile.bak
中保存备份
话虽如此,我不知道你的编辑是什么意思。你想换衣服吗
Some.String = "Some Value"
到
我将简单地逐字符遍历字符串。这样,您也可以处理转义字符串(只需添加一个isEscaped变量)
我建议使用
split
删除带引号的子字符串,然后在删除中间文本中的空格后,将它们与join
重新组合
请注意,如果用于split
的正则表达式包含捕获,则捕获的值也将包含在返回的列表中
下面是一些示例代码
使用严格;
使用警告;
my$source=是为此而定制的:
#!/usr/bin/env perl
use strict;
use warnings;
use Text::ParseWords;
my @strings = (
q{This.string = "Hello World"},
q{That " string " and "another shoutout to my bytes"},
);
for my $s ( @strings ) {
my @words = quotewords '\s+', 1, $s;
print join('', @words), "\n";
}
输出:
This.string="Hello World"
That" string "and"another shoutout to my bytes"
This.string=“你好,世界”
“字符串”和“另一个对我的字节的呼喊”
使用Text::ParseWords
意味着,如果必须处理带转义引号的带引号字符串,您就可以准备好;-)
此外,这听起来像是您有一个某种配置文件,并且正在尝试解析它。如果是这样,可能有更好的解决方案。在双引号上拆分,仅从偶数字段(即引号中的字段)中删除空格:
可以使用regex执行此操作:
s/([^ ]*|\"[^\"]*\") */$1/g
请注意,这不会处理引号内的任何类型的转义。您可以在引号内使用转义引号吗?例如,“引号中的文本”
。不,字符串实际上总是以这种形式出现。Some.String.Info=“引号中的一些文本”。然而,可能有一些人逃脱了。例如:“一些字符串不会”如果字符串是:一些字符串加上“引号”,然后再加上“更多引号”?@ArjunShankar不应该出现,但这是可能的。如果是这样的话,情况会是这样的。Some.String=“Some Value”other.String=“other Value”join
在此处的无效(打印)上下文中是多余的,除非$,
被设置为某个定义的值。一个更具启发性的例子可能是将join
语句指定给标量。您的替换应该包括g(全局)修饰符。
sub remove_spaces {
my $string = shift;
my @fields = split /"/, $string . ' '; # trailing space needed to keep final " in output
my $flag = 1;
return join '"', map { s/ +//g if $flag; $flag = ! $flag; $_} @fields;
}
s/([^ ]*|\"[^\"]*\") */$1/g