如何在perl中拆分多个模式的字符串?

时间:2011-11-24 05:22:21

标签: regex string perl split

我想拆分一个包含多种模式的字符串:

离。

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

这样做的正确方法是什么?

7 个答案:

答案 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对象是否更有意义。