我正在尝试删除由空格分隔的字符串中的所有数字/标点符号组合,即,
$string = " 13-acetate 9-11 777 >3 ctl-54 2!3 ";
应该变成
$string = " 13-acetate ctl-54 ";
我的尝试如下
$string =~ s/\s+[\d*[:punct:]>]+\s+//g;
但这给了我
$string = " 13-acetate 777 ctl-54 ";
感谢你指点我哪里出了问题。
发布于 2014-07-01 16:10:08
问题是,您试图在两次传递中匹配相同的空间。你得用围观镜。
s/(?<!\S)[\d\p{Punct}\p{Symbol}]+(?!\S)//g;
我使用了负面的头和后视镜,这样您就不需要在输入字符串中添加前导和尾随空格。
发布于 2014-07-04 07:25:31
正如ikegami所指出的,你的问题是你试图两次匹配这些空格。
快速修复原始正则表达式的另一种方法是为初始边界条件创建一个替换:
use strict;
use warnings;
my $string = " 13-acetate 9-11 777 >3 ctl-54 2!3 ";
$string =~ s/(?:\G|\s+)[\d[:punct:]]+\s+/ /g;
print $string;
产出:
13-acetate ctl-54
但是,这种方法存在缺陷,因为它不允许删除字符串开头或结尾的单词。这就是为什么在执行边界条件时,负前瞻和后视是优越的。
如果你想用一种聪明的方式去除单词周围的空格,那么下面的方法就会奏效:
$string =~ s{(?:\G|(\s+))[\d[:punct:]]+(?:$|(\s+))}{
my @spaces = grep defined, $1, $2;
pop @spaces;
"@spaces"
}eg;
产出:
13-acetate ctl-54
https://stackoverflow.com/questions/24514865
复制相似问题