Как разбить строку с несколькими шаблонами в Perl? - PullRequest
12 голосов
/ 24 ноября 2011

Я хочу разбить строку на несколько шаблонов:

напр.

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 ]

31 голосов
/ 24 ноября 2011

Используйте класс символов в разделителе регулярного выражения для сопоставления с набором возможных разделителей.

my $string= "10:10:10, 12/1/2011";
my @string = split /[:,\s\/]+/, $string;

foreach(@string) {
    print "$_\n";
}

Объяснение

  • Пара косых черт /.../ обозначает регулярное выражение или шаблон для сопоставления.

  • Пара квадратных скобок [...] обозначает класс символов регулярного выражения.

  • Внутри находится набор возможных символов, которые можно сопоставить: двоеточия :, запятые ,, любой тип пробела \s и косая черта \/ (с обратной косой чертой в качестве escape характер).

  • + необходим для совпадения с 1 или более символами, непосредственно предшествующими ему, что в данном случае является полным классом символов. Без этого, запятая будет рассматриваться как 2 отдельных разделителя, что даст вам дополнительную пустую строку в результате.

5 голосов
/ 24 ноября 2011

Неправильный инструмент!

my $string = "10:10:10, 12/1/2011";
my @fields = $string =~ /([0-9]+)/g;
3 голосов
/ 24 ноября 2011

Вы можете разделить на не цифры;

#!/usr/bin/perl
use strict;
use warnings;
use 5.014;

my $string= "10:10:10, 12/1/2011";
say for split /\D+/, $string;
2 голосов
/ 24 ноября 2011

Чтобы ответить на ваш оригинальный вопрос: Вы искали оператора | :

my $string = "10:10:10, 12/1/2011";

my @string = split(/:|,\s*|\//, $string);

foreach(@string) {
    print "$_\n";
}

Но, как указывают другие ответы, вы часто можете улучшить это с помощью дальнейших упрощений или обобщений.

2 голосов
/ 24 ноября 2011
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;
2 голосов
/ 24 ноября 2011

Если числа - то, что вы хотите, извлеките числа:

my @numbers = $string =~ /\d+/g;
say for @numbers;

Не требуется захватывать скобки, как указано в perlop :

Модификатор / g определяет глобальное сопоставление с образцом, то есть сопоставление столько раз, сколько возможно внутри строки. Как это ведет себя, зависит от контекст. В контексте списка возвращает список подстрок сопоставляется с любыми захватывающими скобками в регулярном выражении. Если нет круглых скобок, он возвращает список всех совпавших строки, как если бы вокруг всего шаблона были круглые скобки.

1 голос
/ 24 ноября 2011

Поскольку вы анализируете что-то, что, очевидно, является датой / временем, мне интересно, имеет ли смысл использовать DateTime :: Format :: Strptime для анализа этого в объекте DateTime.

...