1

我有一个字符串如下。

$line = 'this is my string "hello world"';

我想要一个正则表达式来删除字符串中除“Hello world”区域之外的所有空格字符。

我在下面使用删除空格字符,但它会删除所有字符。

$line=~s/ +//g;

如何排除“Hello world”之间的区域,我得到如下字符串?

thisismystring"hello world"

谢谢

4

5 回答 5

4

由于您可能希望正确处理带引号的字符串,因此您应该查看Text::Balanced模块。

使用它将您的文本拆分为引用部分和未引用部分,然后仅对未引用部分进行替换,最后再次将字符串连接在一起。

于 2012-08-15T12:17:55.390 回答
1

好吧,这是一种方法:

use warnings;
use strict;

my $l = 'this is my string "hello world some" one two three "some hello word"';
$l =~ s/ +(?=[^"]*(?:"[^"]*"[^"]*)+$)//g;

print $l;
# thisismystring"hello world some"onetwothree"some hello word"

演示

但我真的想知道不应该以其他方式完成(例如,通过标记字符串),特别是如果引号可能不平衡。

于 2012-08-15T12:20:10.477 回答
0
s/\s+(?=(?:[^"]*"[^"]*")*[^"]*$)//g

在这里测试代码。

于 2012-08-15T12:16:29.397 回答
0

另一个正则表达式

s/(\s+(".*?")?)/$2/g
于 2012-08-15T12:22:58.343 回答
0
#!/usr/bin/perl
use warnings;
use strict;

sub main {
  my $line = 'this is my string "hello world"';
  while ($line =~ /(\w*|(?:"[^"]*"))\s*/g) { print $1;}
  print "\n";
}

main;
于 2012-08-15T12:23:00.287 回答