使用split()分割字符串,并根据该字符串创建一个数组,以使单词和数字分开。
我知道前行和后行必须用于零宽度分割,因此我使用了它。
$string = 'A1BB22CCC333DDDD';
@string = split(/(?=\d+)|(?<=\d+)/,$string);
print "@string";
期望:
A 1 BB 22 CCC 333 DDDD
但是结果:
在jdoodle.pl第2行的regex m /(?= \ d +)|(?<= \ d +)/中未实现可变长度后视。
以非零状态255退出的命令。
答案 0 :(得分:4)
您可以使用/(\d+)/
之类的模式来分割字符串。
该模式包含一个捕获组;如perldoc split中所述:
如果PATTERN包含捕获组,那么对于每个分隔符,将为一个组捕获的每个子字符串生成一个附加字段(按照反向引用,以指定组的顺序);
考虑:
use strict;
use warnings;
my $string = "A1BB22CCC333DDDD";
my @result = split /(\d+)/, $string;
print "$_\n" for @result;
收益:
A
1
BB
22
CCC
333
DDDD
如果字符串确实以数字开头,则上述解决方案将返回前导空元素。为避免这种情况,可以按如下所示调整表达式:
my @result = grep length, split /(\d+)/, $string;
答案 1 :(得分:2)
选项1:
无需检查分割点每一侧有多少位数字,因此您可以简单地将\d+
替换为\d
,以避免出现错误。但是,您会注意到解决方案的第二个问题:您不仅在数字和非数字之间划分;您也在两个数字之间进行分割。固定:
my @parts = split /(?<=\D)(?=\d)|(?<=\d)(?=\D)/, $string;
选项2:
返回通过传递给split
的模式捕获的文本,从而为我们提供了使用split
的替代解决方案。
my @parts = grep length, split /(\d+)/, $string;
grep
处理$string
以数字开头的情况。
当您要拆分的对象实际上不是分隔符时,您就需要像这样修复split
的输出。这应该告诉您split
在这种情况下不是合适的工具。
选项3:
这里将进行简单的正则表达式匹配。
my @parts = $string =~ /\d+|\D+/g;