Синтаксис Perl в RegExp - PullRequest
       0

Синтаксис Perl в RegExp

0 голосов
/ 22 ноября 2010

Как бы вы разложили (или нет) следующую строку?

if ($Hour =~ /^(\d{2})(\d{2})(\d{2})$/) { $result = "$1:$2:$3" }

Ответы [ 4 ]

3 голосов
/ 22 ноября 2010

Во-первых, не используйте \d, если вы не хотите сопоставить все символы Unicode (например, ? или ᠕).Если вы хотите совпадать с нуля до девяти, вы должны сказать [0-9].

К сожалению, вы не можете сократить это значение до

if ($Hour =~ /^([0-9]{2}){3}$/) { $result = "$1:$2:$3" }

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

if ($Hour =~ /^([0-9]{6})$/) { $result = "$1:$2:$3" }

отсутствует.Вы могли бы сказать

($result = $Hour) =~ s/([0-9]{2})(?!$)/$1:/g;

, но вы бы обменяли ясность на немного более короткую линию.

3 голосов
/ 22 ноября 2010

Выглядит довольно хорошо для меня, как есть.

Вы можете заменить каждый {2} другим \d, если хотите.

Вы можете использовать $result=join":",$Hour=~/^(\d\d)/g, но это не такстрогий - он будет соответствовать любой строке цифр четной длины в начале строки.

1 голос
/ 22 ноября 2010

Я бы использовал \z вместо $, если только вы действительно не хотите разрешить дополнительный символ новой строки.Кроме этого (и непоследовательной заглавной буквы переменных), все в порядке.

1 голос
/ 22 ноября 2010

выглядит хорошо.Соответствие времени может быть принято на различном уровне строгости.Вышеприведенное допускает что-то вроде 999999

. Другой подход для сопоставления 24-часовых часов заключается в использовании

([01]?[4-9]|[012]?[0-3])

для часовой части, а затем

[0-5][0-9]

за минуты.

или (для удовольствия) часовая часть также может быть сопоставлена ​​с помощью

([01]?[0-9]|2[0-3])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...