我有一个字符串如下。
$line = 'this is my string "hello world"';
我想要一个正则表达式来删除字符串中除“Hello world”区域之外的所有空格字符。
我在下面使用删除空格字符,但它会删除所有字符。
$line=~s/ +//g;
如何排除“Hello world”之间的区域,我得到如下字符串?
thisismystring"hello world"
谢谢
由于您可能希望正确处理带引号的字符串,因此您应该查看Text::Balanced模块。
使用它将您的文本拆分为引用部分和未引用部分,然后仅对未引用部分进行替换,最后再次将字符串连接在一起。
好吧,这是一种方法:
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"
演示。
但我真的想知道不应该以其他方式完成(例如,通过标记字符串),特别是如果引号可能不平衡。
s/\s+(?=(?:[^"]*"[^"]*")*[^"]*$)//g
在这里测试代码。
s/(\s+(".*?")?)/$2/g
#!/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;