我想拆分一个包含多种模式的字符串:
离。
my $string= "10:10:10, 12/1/2011";
my @string = split(/firstpattern/secondpattern/thirdpattern/, $string);
foreach(@string) {
print "$_\n";
}
我希望输出:
10
10
10
12
1
2011
这样做的正确方法是什么?
答案 0 :(得分:31)
在正则表达式分隔符中使用character class以匹配一组可能的分隔符。
my $string= "10:10:10, 12/1/2011";
my @string = split /[:,\s\/]+/, $string;
foreach(@string) {
print "$_\n";
}
<强>解释强>
这对斜杠/.../
表示要匹配的正则表达式或模式。
方括号[...]
对表示正则表达式的字符类。
Inside是可以匹配的可能字符集:冒号:
,逗号,
,任何类型的空格字符\s
和正斜杠{{1} (使用反斜杠作为转义字符)。
需要\/
来匹配紧接在其前面的一个或多个字符,在这种情况下,这是整个字符类。如果没有这个,逗号空间将被视为2个单独的分隔符,在结果中为您提供额外的空字符串。
答案 1 :(得分:5)
错误的工具!
my $string = "10:10:10, 12/1/2011";
my @fields = $string =~ /([0-9]+)/g;
答案 2 :(得分:3)
您可以拆分非数字;
#!/usr/bin/perl
use strict;
use warnings;
use 5.014;
my $string= "10:10:10, 12/1/2011";
say for split /\D+/, $string;
答案 3 :(得分:2)
如果您想要数字,请提取数字:
my @numbers = $string =~ /\d+/g;
say for @numbers;
根据perlop:
中的规定,不需要捕获括号/ g修饰符指定全局模式匹配 - 即匹配 字符串中尽可能多的次数。它的表现取决于 上下文。在列表上下文中,它返回子字符串的列表 与正则表达式中的任何捕获括号匹配。 如果 没有括号,它返回所有匹配的列表 字符串,好像整个模式周围都有括号。
答案 4 :(得分:2)
my $string= "10:10:10, 12/1/2011";
my @string = split(m[(?:firstpattern|secondpattern|thirdpattern)+], $string);
my @string = split(m[(?:/| |,|:)+], $string);
print join "\n", @string;
答案 5 :(得分:2)
回答您的原始问题:
你在寻找the |
operator:
my $string = "10:10:10, 12/1/2011";
my @string = split(/:|,\s*|\//, $string);
foreach(@string) {
print "$_\n";
}
但是,正如其他答案所指出的那样,你可以通过进一步的简化或概括来改进这一点。
答案 6 :(得分:1)
当您正在解析显然是日期/时间的内容时,我想知道使用DateTime::Format::Strptime将其解析为DateTime对象是否更有意义。