Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在Perl中,如何删除所有不在双引号内的空格&引用;?_Regex_Perl - Fatal编程技术网

Regex 在Perl中,如何删除所有不在双引号内的空格&引用;?

Regex 在Perl中,如何删除所有不在双引号内的空格&引用;?,regex,perl,Regex,Perl,我想用一些正则表达式来删除字符串中的所有空格字符,只要它不在双引号(“)内 示例字符串: 某些字符串带有“引号中的文本” 结果: somestringwith“引号中的文本” 到目前为止,我已经想出了这样的办法: $str =~ /"[^"]+"|/g; 但它似乎没有达到预期的效果 老实说,我对perl非常陌生,没有太多的regexp经验。因此,如果有人愿意回答,我也愿意提供一些关于为什么以及如何回答的见解,那将非常好 谢谢 编辑 字符串将不包含转义的“'s” 实际上,它的格式应始终如

我想用一些正则表达式来删除字符串中的所有空格字符,只要它不在双引号(“)内

示例字符串:

某些字符串带有“引号中的文本”

结果:

somestringwith“引号中的文本”

到目前为止,我已经想出了这样的办法:

    $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