3

我想提出一些正则表达式,只要它不在双引号(“)内,它就会从字符串中删除所有空格字符。

示例字符串:

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

结果:

somestringwith"引号中的文字"

到目前为止,我想出了这样的事情:

    $str =~ /"[^"]+"|/g;

但它似乎并没有给出预期的结果。

老实说,我是 perl 的新手,并且没有太多的正则表达式经验。因此,如果有人愿意回答,也愿意提供一些关于为什么以及如何做到这一点的见解!

谢谢!

编辑

字符串不会包含转义的“”

它实际上应该总是这样格式化:

Some.String = "一些值"

结果将是

Some.String="一些值"

4

6 回答 6

5

这是一种split用于分隔带引号的字符串的技术。它依赖于您的数据是一致的,并且不适用于松散的引号。

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"

Some.String="Some Value"
于 2012-04-20T15:01:04.333 回答
3

Text::ParseWords是为此量身定做的:

#!/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="你好世界"
那个“字符串”和“我的字节的另一个大喊”

Text::ParseWords如果您不得不处理带有转义引号的带引号的字符串,则使用手段,您已经准备好;-)

此外,这听起来像您有某种配置文件并且您正在尝试解析它。如果是这种情况,可能会有更好的解决方案。

于 2012-04-20T15:11:20.430 回答
1

我建议使用删除引用的子字符串split,然后join在从中间文本中删除空格后重新组合它们。

请注意,如果用于split包含捕获的正则表达式,则捕获的值也将包含在返回的列表中。

这是一些示例代码。

use strict;
use warnings;

my $source = <<END;
Some.String = "Some Value";
Other.String = "Other Value";
Last.String = "Last Value";
END

print join '', map {s/\s+// unless /"/; $_; } split /("[^"]*")/, $source;

输出

Some.String= "Some Value";Other.String = "Other Value";Last.String = "Last Value";
于 2012-04-20T15:10:55.997 回答
0

我会简单地逐个字符地遍历字符串。这样您也可以处理转义字符串(只需添加一个 isEscaped 变量)。

my $text='lala "some thing with quotes " lala ... ';
my $quoteOpen = 0;
my $out;

foreach $char(split//,$text) {
  if ($char eq "\"" && $quoteOpen==0) {
    $quoteOpen = 1;
    $out .= $char;
  } elsif ($char eq "\"" && $quoteOpen==1) {
    $quoteOpen = 0;
    $out .= $char;
  } elsif ($char =~ /\s/ && $quoteOpen==1) {
    $out .= $char;
  } elsif ($char !~ /\s/) {
    $out .= $char;
  }
}

print "$out\n";
于 2012-04-20T15:10:18.277 回答
0

拆分双引号,仅从偶数字段中删除空格(即引号中的空格):

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;
}
于 2012-04-20T21:11:47.580 回答
0

可以用正则表达式完成:

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

请注意,这不会处理引号内的任何类型的转义。

于 2012-04-26T15:10:03.803 回答