Как соответствовать дате в Perl — предположение, что UNIX regex совпадает с Perl

По умолчанию zsh расширяет псевдоним до завершения. Возможно, что ваша конфигурация отключит это; вы можете явным образом включить её, отключив опцию complete_aliases.

unsetopt complete_aliases

Для внешней команды типа proxyychains4, вы можете объявить, что ее аргументы сами по себе являются командой и ее аргументами, сделав ее завершение _precommand. Это не просто найти в документации, но вы можете наблюдать конфигурацию для подобных команд, таких как nohup, запустив echo $_comps[nohup]. Это происходит с "новой" системой завершения (после выполнения compinit).

compdef _precommand proxychains4

0
31.05.2014, 22:50
2 ответа

Регулярные выражения Perl и Perl Compatible Regular Expressions немного отличаются от POSIX "basic" или "extended" regex, которые реализуют утилиты типа grep. Wikipedia, вероятно, лучшее место для ознакомления с различиями. Поддержка PCRE может быть доступна не только в Perl, например, в GNU grep -P.

Для базового regex:

echo "Monday Feb 23" | grep '^[[:alpha:]]+day (Jan\|Feb\|Mar\|Apr\|May\|Jun\|Jul\|Aug\|Sep\|Oct\|Nov\|Dec)[[:alpha:]]* [1-9][0-9]?$'

Для Perl regex с именованными группами захвата:

$re = qr/
  ^                      # Start of string
  (?<day>[[:alpha:]]+day)  # Match one or more alpha characters before "day". 
  \s+                    # One or more whitespace chars
  (?<month>(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[[:alpha:]]*) # Months
  \s+                    # One or more whitespace chars
  (?<number>\d{1,2})     # 1-2 digits.   
  $                  # End of string. 
/x;

print "match\n" if ( "Thursday May 1" =~ $re );
print "match\n" if ( "Monday February 23" =~ $re );
print "no match\n" if ( "Wednesday May 123" !~ $re );
print "no match\n" if ( "Thursday Blarg 23" !~ $re );
print "no match\n" if ( "Inglebert January 5" !~ $re );

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

При успешном совпадении каждое поле будет храниться в своей собственной группе захвата, доступ к которой осуществляется через хэш совпадения $+

printf "day [%s] month [%s] day of month [%s]\n", $+{day}, $+{month}, $+{number}

Если вы хотите, чтобы совпадение чисел было точным, вы можете использовать более технический подход.

(?<number>[1-9]|[12][0-9]|3[01])

Если вы дошли до этого уровня, вам следует использовать модуль разбора даты, а не регулярные выражения, поскольку даты слишком сложны. Например, 31 апреля или февраль в целом.

1
28.01.2020, 02:52

Ваш ввод будет соответствовать следующему шаблону в Perl. Вот Perl oneliner:

perl -e 'if("Monday February 23" =~ /(^.*day (Jan.*|Feb.*|Mar.*|Apr.*|May|Jun.*|Jul.*|Aug.*|Sep.*|Oct.*|Nov.*|Dec.*) [1-31]+)/) {print $1}'
0
28.01.2020, 02:52

Теги

Похожие вопросы