使用split()拆分字符串,并从该字符串中创建一个数组,以便将单词和数字分开。
我知道向前看和向后看需要用于零宽度分裂,所以我使用了它。
$string = 'A1BB22CCC333DDDD';
@string = split(/(?=\d+)|(?<=\d+)/,$string);
print "@string";
预期:
A 1 BB 22 CCC 333 DDDD
但结果:
可变长度查找没有在regex /(?=\d+)\(?<=\d+)/ at jdoodle.pl第2行中实现。 命令在非零状态255下退出。
发布于 2019-03-30 15:46:42
您可以使用像/(\d+)/
这样的模式来拆分字符串。
该模式包含一个捕获组;正如perldoc分裂中所解释的那样
如果模式包含捕获组,那么对于每个分隔符,为组捕获的每个子字符串生成一个附加字段(按照指定组的顺序,按反向引用的顺序);
考虑:
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;
发布于 2019-03-31 00:58:02
选项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:
一个简单的regex匹配就可以了。
my @parts = $string =~ /\d+|\D+/g;
https://stackoverflow.com/questions/55432939
复制相似问题