Пожалуйста, объясните это регулярное выражение Perl

    $rowfetch =~ s/['-]//g; #All chars inside the [ ] will be filtered out.
    $rowfetch =~ m/(\w+), ?(.)/;
    printf $fh lc($2.$1);

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

Это имя, как Париж, Кеннет, и печатает kparisi.

Известно:
s/= заменить m/= match


Я попытался найти остальное, но не смог найти ничего, что действительно помогло бы объяснить это.

Я тоже не понял как предполагается, что = ~ оценивается как true, так и false, но в этой ситуации он модифицирует строку.

Ответ 1

Я держу один из этих чит-листов, прикрепленных к моей стене куба только для таких случаев. Google для regular expression cheat sheet, чтобы найти других.

Чтобы добавить к тому, что вы уже знаете:

  g -- search globally throughout the string
  + -- match at least one, but as many as possible
  ? -- match 0 or 1
  . -- match any character
 () -- group these together
  , -- a plain comma, no special meaning
 [] -- match any character inside the brackets
 \w -- match any word character

Магия в группировке - выражение соответствия использует группы и помещает их в переменные $1 и $2. В этом случае $1 соответствует слову перед запятой, а $2 соответствует первому символу после пробела после запятой.

Ответ 2

Я нахожу модуль YAPE::Regex::Explain очень полезным -

C:\>perl -e "use YAPE::Regex::Explain;print YAPE::Regex::Explain->new(qr/['-])->explain;"
The regular expression:

(?-imsx:['-])

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  ['-]                     any character of: ''', '-'
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------



C:\>perl -e "use YAPE::Regex::Explain; print YAPE::Regex::Explain->new(qr/(\w+), ?(.)/)->explain;"
The regular expression:

(?-imsx:(\w+), ?(.))

matches as follows:

NODE                     EXPLANATION
----------------------------------------------------------------------
(?-imsx:                 group, but do not capture (case-sensitive)
                         (with ^ and $ matching normally) (with . not
                         matching \n) (matching whitespace and #
                         normally):
----------------------------------------------------------------------
  (                        group and capture to \1:
----------------------------------------------------------------------
    \w+                      word characters (a-z, A-Z, 0-9, _) (1 or
                             more times (matching the most amount
                             possible))
----------------------------------------------------------------------
  )                        end of \1
----------------------------------------------------------------------
  ,                        ','
----------------------------------------------------------------------
   ?                       ' ' (optional (matching the most amount
                           possible))
----------------------------------------------------------------------
  (                        group and capture to \2:
----------------------------------------------------------------------
    .                        any character except \n
----------------------------------------------------------------------
  )                        end of \2
----------------------------------------------------------------------
)                        end of grouping
----------------------------------------------------------------------

C:\>

Ответ 3

Скачайте "The Regex Coach" и изучите его. Подумайте о покупке "Освоение регулярных выражений", поскольку он проведет вас через это минное поле. Это одна из самых популярных книг, которые я когда-либо видел, и глубоко информативна, но проницаема.

Ответ 4

1-я строка: символы внутри [] ('и -) сопоставляются и заменяются (-ами) ничем, поэтому удаляются. /g означает глобальный и будет пытаться сопоставить все в строке.

Вторая строка:\w означает символ слова, + означает более одного раза.? означает 0 или один раз. "" означает что угодно. Таким образом, это означает поиск любого символа слова, найденного более одного раза, за которым следует кома, за которым следует пробел или один раз, за ​​которым следует один из символов.

Ответ 5

$lhs =~ s/foo/bar/g;

Оператор s/ является изменяющим регулярным выражением в Perl - вы сопоставляете LHS с первой частью справа (foo). Вторая часть определяет замену для совпадения в первой части (bar). Поэтому "Lafooey" переходит в "Labarey".

В вашем вопросе цель состоит в том, чтобы удалить все "и", как в "О'Хэнлон" и "Чальмонли-Уайтингтон-Смит".

Затем он соответствует "Фамилия, Первый символ первого имени". Скобки помещают значения этих совпадений в переменные $1 и $2.

И печатает строчную букву "F" + "Lastname", потому что это значения в $2 и $1.

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

Ответ 6

iirc = = означает make, равный совпадению (только cf "~", возвращая true, если соответствует)

Ответ 7

=~ соответствует выражению (строке) слева от обычного выражения с правой стороны, он не изменяет строку. Побочный эффект Asa задает переменные $1, $2,... для скобок, заключенных в скобки.

В вашем случае первая скобка будет соответствовать "(\w+)" (символы слова повторяются одно или несколько раз, а вторая соответствует "(.)" (первая буква данного имени). " ?" выражение будет соответствовать необязательному пространству.

Ответ 8

Обратите внимание, что данный код терпит неудачу, если вход не находится в правильном формате. Вот что я буду делать:

$rowfetch =~ s/[ '-]//g; #All chars inside the [ ] will be filtered out.
if($rowfetch =~ m/(\w+),([a-z])/i) {
    printf $fh lc($2.$1);
}

позиционные переменные $1- $9 сохраняют последнее успешное совпадение, но они не reset в случае неудачных совпадений. Это означает, что если регулярное выражение не соответствует, $1 и $2 не будут стерты, и вы получите что-то иное, чем вы хотели.

Я также немного изменил регулярное выражение. Первая строка также удаляет пробелы. Поскольку создается впечатление, что вы создаете имена пользователей или адреса электронной почты, вам не нужны пробелы. Вторая строка более строгая, чтобы гарантировать, что $2 - это буква, а не какой-то другой символ. "I" в конце говорит perl, чтобы все буквы соответствовали регистру без учета. При этом мне не нужно делать эту вторую часть ([a-zA-Z]).

Ответ 9

У YAPE:: Regex:: Explain есть отличный веб-интерфейс.

Вот объяснение s/['-]//g

и для m/(\ w +),? (.)/