Почему регулярное выражение не соответствует последней части строки? - PullRequest
2 голосов
/ 28 мая 2019

Почему это регулярное выражение:

Summary:(\r\n\t\t\/\/     (.+))+

не соответствует последней строке следующей строки? (ЗАМЕТЬТЕ, что пробел в начале каждой строки - это два символа табуляции, но он был преобразован во все пробелы, по крайней мере, в моем браузере - это правильно в режиме редактирования.) Не должно + Квантор приводит к тому, что часть шаблона в самых внешних паренах тоже совпадает с последней строкой?

        //
        // Summary:
        //     Do absolutely nothing and don't do anything else other than to do nothing at
        //     all.

Вот результат на http://regexstorm.net/tester:

enter image description here

Ответы [ 2 ]

2 голосов
/ 28 мая 2019

Это похоже на ошибку для меня. Посмотри, что происходит:

  • Summary: сопоставляется первым
  • (\r\n\t\t// (.+))+ - на итерации 1 он захватывает "\r\n\t\t// Do absolutely nothing and don't do anything else other than to do nothing at\r" (обратите внимание на последние \r, . в регулярном выражении .NET, по умолчанию соответствует символу CR)
  • Квантор + сигнализирует механизму регулярных выражений, чтобы он попытался сопоставить подстроку справа от текущего совпадения, т.е. "\n\t\t// all.". Он не может соответствовать ему, поскольку начинается с \n. Шаблон должен расшириться как "\r\n\t\t// (.+)\r\n\t\t// (.+)" и т. Д., Т. Е. \r\n\t\t// (.+)(?:\r\n\t\t// (.+))*, но он не включает возврат с (.+). Действительно, механизм регулярных выражений может по-разному сопоставлять строку, так как .+ отвечает требованиям для возврата, но каким-то образом ., который соответствует CR, не хочет возвращать ее .

Обходной путь должен соответствовать первому \r как дополнительному символу:

Summary:(\r?\n\t\t//     (.+))+

Или просто сопоставьте любые символы, кроме CR и LF, с [^\r\n]+ (это обеспечит более чистые значения в стеке захвата Группы 2):

Summary:(\r\n\t\t//     ([^\r\n]+))+

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

0 голосов
/ 28 мая 2019

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

Summary:([\s\S]*)

или

Summary:([\w\W]*)

или

Summary:([\d\D]*)

DEMO

enter image description here

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