Вставка с помощью Regex для форматирования даты (Perl) - PullRequest
3 голосов
/ 04 апреля 2010

Предположим, у меня есть строка 04032010. Я хочу, чтобы это было 04/03/2010. Как мне вставить косую черту с помощью регулярного выражения?

Ответы [ 3 ]

4 голосов
/ 04 апреля 2010

Чтобы сделать это с помощью регулярного выражения, попробуйте следующее:

my $var = "04032010";
$var =~ s{ (\d{2}) (\d{2}) (\d{4}) }{$1/$2/$3}x;
print $var;

\d означает совпадение одной цифры. И {n} означает предшествующий совпадающий символ n раз. В сочетании вы получаете \d{2} для совпадения с двумя цифрами или \d{4} для сопоставления с четырьмя цифрами. Окружая каждый набор в скобках, совпадение будет сохранено в переменной $1, $2, $3 ... и т. Д.

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

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

Сравнить s{(\d{2})(\d{2})(\d{4})}{$1/$2/$3}x; против s{ (\d{2}) (\d{2}) (\d{4}) }{$1/$2/$3}x;

3 голосов
/ 04 апреля 2010

Ну, регулярное выражение просто совпадает, но вы можете попробовать что-то вроде этого: s /(..)(..)(..)/$ 1 / $ 2 / $ 3 /

#!/usr/bin/perl

$var = "04032010";
$var =~ s/(..)(..)(....)/$1\/$2\/$3/;
print $var, "\n";

У меня работает:

$ perl perltest
04/03/2010
2 голосов
/ 04 апреля 2010

Я всегда предпочитаю использовать другой разделитель, если задействован /, поэтому я бы выбрал

s| (\d\d) (\d\d) |$1/$2/|x ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...