如何在Perl中将字符串中的字母和数字分开?

时间:2019-03-30 15:27:39

标签: perl split substitution lookahead lookbehind

使用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退出的命令。

2 个答案:

答案 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;