首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在perl中拆分字符串的字母和数字?

如何在perl中拆分字符串的字母和数字?
EN

Stack Overflow用户
提问于 2019-03-30 15:27:38
回答 2查看 1.4K关注 0票数 2

使用split()拆分字符串,并从该字符串中创建一个数组,以便将单词和数字分开。

我知道向前看和向后看需要用于零宽度分裂,所以我使用了它。

代码语言:javascript
运行
复制
$string = 'A1BB22CCC333DDDD';
@string = split(/(?=\d+)|(?<=\d+)/,$string);
print "@string";

预期:

代码语言:javascript
运行
复制
A 1 BB 22 CCC 333 DDDD

但结果:

可变长度查找没有在regex /(?=\d+)\(?<=\d+)/ at jdoodle.pl第2行中实现。 命令在非零状态255下退出。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-30 15:46:42

您可以使用像/(\d+)/这样的模式来拆分字符串。

该模式包含一个捕获组;正如perldoc分裂中所解释的那样

如果模式包含捕获组,那么对于每个分隔符,为组捕获的每个子字符串生成一个附加字段(按照指定组的顺序,按反向引用的顺序);

考虑:

代码语言:javascript
运行
复制
use strict;
use warnings;
my $string = "A1BB22CCC333DDDD";
my @result = split /(\d+)/, $string;
print "$_\n" for @result;

产量:

代码语言:javascript
运行
复制
A
1
BB
22
CCC
333
DDDD

如果字符串以数字开头,上述解决方案将返回一个前导空元素。为了避免这种情况,您可以对表达式进行如下调整:

代码语言:javascript
运行
复制
my @result = grep length, split /(\d+)/, $string;
票数 5
EN

Stack Overflow用户

发布于 2019-03-31 00:58:02

选项1:

不需要检查拆分点两边有多少位数,所以您只需将\d+替换为\d,以避免所得到的错误。但是,您会注意到解决方案的第二个问题:您不仅在数字和非数字之间进行分割,还在两位数字之间进行分割。固定:

代码语言:javascript
运行
复制
my @parts = split /(?<=\D)(?=\d)|(?<=\d)(?=\D)/, $string;

备选方案2:

传递给split的模式捕获的文本将被返回,为我们提供了一个使用split的替代解决方案。

代码语言:javascript
运行
复制
my @parts = grep length, split /(\d+)/, $string;

grep处理$string以数字开头的情况。

当您正在拆分的东西实际上不是分隔符时,您就会遇到这样的情况,您需要这样修复split的输出。这应该告诉您,在这种情况下,split不是合适的工具。

选项3:

一个简单的regex匹配就可以了。

代码语言:javascript
运行
复制
my @parts = $string =~ /\d+|\D+/g;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55432939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档