Подтвердить что ты не робот

Как разбить строку с несколькими шаблонами в perl?

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

ех.

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

Каков правильный способ сделать это?

4b9b3361

Ответ 1

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

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

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

Объяснение

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

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

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

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

Ответ 2

Неверный инструмент!

my $string = "10:10:10, 12/1/2011";
my @fields = $string =~ /([0-9]+)/g;

Ответ 3

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

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

my $string= "10:10:10, 12/1/2011";
say for split /\D+/, $string;

Ответ 4

Если числа нужны вам, извлеките числа:

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

Захват скобок не требуется, как указано в perlop:

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

Ответ 5

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;

Ответ 6

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

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

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

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

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

Ответ 7

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