Знакомство с регулярными выражениями в Perl - PullRequest
1 голос
/ 26 января 2011

Я пытаюсь написать регулярное выражение для соответствия этой строке:
ДД МЕСЯЦ ГОД в ЧЧ: ММ
, например:
21 мая 2009 г. в 19: 09

Итак, у меня есть:
[0-30-9] на день
[0-20-90-90-9] на год
[0-90-9: 0-90-9]на время

Я не понимаю, как соединить все это в единое регулярное выражение.Я хочу сделать

if($string =~ /myregex/) { }

Но не могу сформировать все это.Также я не знаю, как написать регулярное выражение для месяца, оно должно соответствовать одному из 12 месяцев года.

Я - Perl Noob (это мой первый день) и Regex Noob.так что помогите оценили!

Ответы [ 3 ]

2 голосов
/ 26 января 2011

[0-30-9] не делает то, что вы думаете, что делает. :)

[0-3][0-9] это то, что вы ищете. Аналогичные шаги для каждого из других входов ...

[0-3]?\d (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) \d\d\d\d at [012]\d:[0-5]\d

? означает, что первая цифра может быть там.

\d означает «цифра», иногда более разборчивая.

(foo|bar|baz) называется «чередование».

Время - проблема :) Это хорошо и просто, но соответствует времени как 29:59. Хехе. Вы могли бы сделать это лучше с чередованием: (\d|1\d|2[0-3]) - менее разборчиво, но более правильно.

И мой совет для неофита Perl, работающего с регулярным выражением, - начинать с малого и строить их итеративно. Требуется работа. :)

1 голос
/ 26 января 2011

Ну, у вас есть не совсем правильные части. Вместо [0-30-9] я думаю, что вы имеете в виду [0-3][0-9], и аналогично для других чисел.

Тем не менее, обычно достаточно быть немного более свободным и просто использовать \d, что эквивалентно [0-9].

Вы соединяете части один за другим:

/\d\d (MONTH) \d\d\d\d at \d\d:\d\d/

Что можно записать более кратко, как:

/\d\d (MONTH) \d{4} at \d\d:\d\d/

Или, если вам действительно нужно, чтобы он был более строгим, как в вашей формулировке:

/[0-3]\d (MONTH) [0-2]\d{3} at \d\d:\d\d/

Я оставил бит месяца последним, поскольку он более сложный. Снова вы можете быть свободным или строгим.

затягивая:

/[0-3]\d [A-Za-z]+ [0-2]\d{3} at \d\d:\d\d/

Для строгого соответствия мы можем использовать чередование, каждая альтернатива отделена '|' и список вариантов заключен в круглые скобки (хотя будьте осторожны, скобки также имеют другое дополнительное значение; не волнуйтесь, в этом случае это не помешает):

/[0-3]\d (January|February|March|April|May|June|July|August|September|October|November|December) [0-2]\d{3} at \d\d:\d\d/

Наконец, если день не дополняется 0 (то есть 1-й - просто «1», а не «01»), вам нужно сделать это необязательным:

/[0-3]?\d (January|February|March|April|May|June|July|August|September|October|November|December) [0-2]\d{3} at \d\d:\d\d/

Шпаргалка

  • [] используются для создания класса символов, набора совпадающих символов
  • \ d - это встроенный класс символов, эквивалентный [0-9]
  • () используются для создания группы, полезной для определения чередования (среди прочего)
  • | используется для создания чередования, списка альтернативных последовательностей символов, которые должны соответствовать
  • {n} - модификатор, говорящий, что 'n' предыдущего символа или класса символов должно совпадать
  • + - это модификатор, говорящий о том, что 1 или более предшествующего символа или класса символов должны совпадать
  • ? является модификатором, говоря, что 0 или 1 предыдущего символа или класса символов должны совпадать
0 голосов
/ 26 января 2011

CPAN имеет несколько общих регулярных выражений в ветви Regexp :: Common :: *.Для вашего случая посмотрите http://search.cpan.org/perldoc?Regexp::Common::time.

Возможно, я должен добавить, поскольку вы новичок в Perl, CPAN - это коллекция Perl-модулей, созданных пользователями для задач.Многие вещи, которые люди могут захотеть сделать, уже были сделаны ранее и собраны для вас.Чтобы установить вещи, которые вы можете сделать sudo cpan modulename (при условии, что вы работаете в Linux, я уверен, что вы можете найти инструкции для CPAN на Mac и Windows, но я их не знаю).

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