Как \ 1 работает в регулярных выражениях perl? - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь сопоставить строку вроде (что-то что-то).

$_ = "anna is ann";
if (/([a-zA-Z]+) is \1/) {
    print "matched\n";
}

Я ожидал, что это не сработает, но работает. Почему?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Соответствует 6 символам, начиная с позиции 3 (a is a). Возможно, вам следовало использовать

/^([a-zA-Z]+) is \1\z/

  1. Начиная с позиции 0.
    1. [a-zA-Z]+ соответствует 4 символам в позиции 0.
      1. is соответствует 4 символам в позиции 4.
      2. \1 не соответствует позиции 8: возврат.
    2. [a-zA-Z]+ соответствует 3 символам в позиции 0.
      1. is не соответствует положению 3: возврат.
    3. [a-zA-Z]+ соответствует 2 символам в позиции 0.
      1. is не соответствует положению 2: возврат.
    4. [a-zA-Z]+ соответствует 1 символу в позиции 0.
      1. is не соответствует положению 1: возврат.
  2. Начало поз. 1.
    1. [a-zA-Z]+ соответствует 3 символам в поз. 1.
      1. is соответствует 4 символам в позиции 4.
      2. \1 не соответствует позиции 8: возврат.
    2. [a-zA-Z]+ соответствует 2 символам в позиции 1.
      1. is не соответствует позиции 3: возврат.
    3. [a-zA-Z]+ соответствует 1 символу в позиции 1.
      1. is не соответствует положению 2: возврат.
  3. Начало поз. 2.
    1. [a-zA-Z]+ соответствует 2 символам в позиции 2.
      1. is соответствует 4 символам в позиции 4.
      2. \1 не соответствует позиции 8: возврат.
    2. [a-zA-Z]+ соответствует 1 символу в позиции 2.
      1. is не соответствует положению 3: возврат.
  4. Начало поз. 3.
    1. [a-zA-Z]+ соответствует 1 символу в позиции 3.
      1. is соответствует 4 символам в позиции 4.
      2. \1 соответствует 1 символу в позиции 8.
      3. Match! (6 символов, начиная с позиции 3)
0 голосов
/ 29 апреля 2018

Попробуйте print $1; или print $&; - /([a-zA-Z]+) is \1/ соответствует подстроке a is a anna is ann. Если вы хотите ограничить совпадение, вы можете привязать начало и / или конец строки (или строки в /m) с помощью ^ соответственно. $, или используйте границу слова \b, если вы хотите найти соответствие в более длинной строке. Итак:

/^([a-zA-Z]+) is \1$/ будет соответствовать "anna is anna", но не "anna is ann" или "anna is anna ".

/\b([a-zA-Z]+) is \1\b/ будет соответствовать "x anna is anna y" и "sue-ann is ann-marie", но не "anna is ann", "anna is anne" или "anna is annabelle".

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