Регулярное выражение в Perl - PullRequest
0 голосов
/ 27 июля 2011

Мне нужно извлечь 4-е значение поля (128) из следующей строки, используя регулярное выражение.

( '29/11/2010 09:38:05', '41297', '29/11/2010 09:40:30', '128', '17', 'SUCCESS', '30', 'e', '9843171457', '1', '-1')

Пожалуйста, скажите мне, как взять 4-е значение.

Спасибо завперед.

Ответы [ 3 ]

7 голосов
/ 27 июля 2011

Использование Text::CSV из CPAN:

my $input = "( '29/11/2010 09:38:05', '41297', '29/11/2010 09:40:30', '128', '17', 'SUCCESS', '30', 'e', '9843171457', '1', '-1')";

my $csv = Text::CSV->new({
    quote_char       => "'",
    always_quote     => 1,
    allow_whitespace => 1,
});
$csv->parse($input);
my @columns = $csv->fields();
print $columns[3], "\n"; # 128
2 голосов
/ 27 июля 2011

Путь грубой силы:

/'[^']*',\s*'[^']*',\s*'[^']*',\s*'([^']*)'/

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

Как указала Кэмерон, вы можете избежать повторения, используя:

/(?:'[^']*',\s*){3}'([^']*)'/ 

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

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

1 голос
/ 27 июля 2011

Это просто команда Perl "split"

$str = ('29/11/2010 09:38:05','41297','29/11/2010 09:40:30','128','17','SUCCESS','30','e', '9843171457','1','-1');

@vars = split(/','/,$str);
print "${vars[3]}\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...