игнорировать определенный символ \ n, все еще включая флаг m - PullRequest
0 голосов
/ 27 апреля 2018

Я хочу сопоставить символы в нескольких строках, поэтому я включил флаг m. Тем не менее, я не хочу совпадать с конкретным \ n. Вместо этого я хочу соответствовать только пробелу. Но похоже, что символ новой строки тоже совпадает с пробелами:

 " 41\n6332 Hardin Rd, Bensalem, PA\n 19020" =~ /\s(\d+\s.+,.+,.+\d+)/m
 => 0 

" 41\n6332 Hardin Rd, Bensalem, PA\n 19020" =~ /\s(\d+[ ].+,.+,.+\d+)/m
 => 3 

Даже я пытаюсь явно игнорировать символ новой строки:

" 41\n6332 Hardin Rd, Bensalem, PA\n 19020" =~ /\s(\d+[^\n].+,.+,.+\d+)/m
 => 0 

Почему символ новой строки соответствует пробелу? И что я могу сделать, чтобы убедиться, что он не совпадает и по-прежнему совпадает с символами в нескольких строках в других местах?

1 Ответ

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

Шаблон /\s(\d+[^\n].+,.+,.+\d+)/m соответствует " 41\n6332 Hardin Rd, Bensalem, PA\n 19020", потому что, когда движок регулярных выражений получает значение [^\n] после сопоставления 41 с \d+, происходит обратное отслеживание: механизм регулярных выражений пытается сопоставить строку по-разному, поскольку он встретил \n и следующий символ должен быть другим символом. Таким образом, он возвращается к \d+ и соответствует 4, а 1 не является новой строкой, поэтому сопоставление продолжается.

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

/\A\s*(\d++(?!\n).+,.+,.+\d)/m

См. Демоверсию regex

Детали

  • \A - начало строки
  • \s* - 0+ пробелов
  • (\d++(?!\n).+,.+,.+\d) - Группа захвата 1:
    • \d++(?!\n) - 1+ цифр (собственно совпавших с квантификатором ++), за которыми не следует новая строка (так как (?!\n) - это отрицательный прогноз, который не дает совпадения, если есть новая строка сразу справа от текущего местоположения )
    • .+,.+, - 2 вхождения любых 1+ символов как можно больше, затем следует ,
    • .+\d - любые 1+ символов, как можно больше, с последующей цифрой.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...