Захват одного экземпляра поиска по регулярному выражению
Я пытаюсь использовать Regex для поиска между началом отчета и началом следующего отчета далее по тому же файлу, захватить отчет целиком, затем использовать его для поиска дубликатов и их удаления.
Они разбиты CRLFs, и я думал, что я был умным, делая (\r\n).*(\r\n)
захватить отчет, найти, удалить, повторить для следующего отчета.
Когда я делаю (\r\n).*(\r\n)
захватывает от следующего CRLF до последнего CRLF в файле.
Я не могу понять, как ограничить поиск только одним экземпляром первой строки отчета, ~30 строками тела, а затем концом отчета.
1 ответ
Ваша проблема в том, что точка соответствует новой строке. Попробуйте снять флажок "точка соответствует новой строке". Который в notepad++ может быть не сложно найти (см. Нижний левый угол диалогового окна edit..find notepad++). Я не буду включать изображение, потому что вы не поместили notepad++ в заголовок, и я думаю, что будет хорошо, если ответ не испорчен, чтобы он выглядел слишком ориентированным на notepad++ и неоправданно ориентированным на notepad++. Другие программы, которые поддерживают регулярные выражения, также имеют точку с новой точкой, которая может быть отмечена или не отмечена.
Вы можете поэкспериментировать с другими поисками и посмотреть, работают ли они или нет.. некоторые будут работать независимо от точки, например, если они не используют точку, или если они могут использовать точку, но с, например, .*?
который использует оператор *?
так что это не слишком много. Другие примеры регулярных выражений требуют, чтобы точка, соответствующая новой строке, не отмечалась. Так что можете снять галочку и поставить галочку, чтобы увидеть какой контраст. Вы можете попробовать это ^.*$
с точкой соответствует новой строке, не отмеченной галочкой. Или твой с ним не отмечен. Или посмотрите, что происходит с этим своего рода шаблоном в форме [^X]*X (это хороший способ избежать проблемы, например, если вы это сделаете.* X, тогда * будет включать в себя x, а вы не хотите, чтобы. Таким образом, вы можете указать все, что не х, *, а затем х), например, \r\n[^\r\n]*\r\n
или же [^\r\n]*\r\n
пытаться ^[^\r\n]*\r\n
Обратите внимание, каретка в квадратных скобках означает не. Внешние квадратные скобки ^ означают совпадение в начале строки. Другой способ пытается *?
конкретно .*?
например \r\n.*?\r\n
.*?
будет соответствовать нескольким точкам, насколько это возможно. Так .*?X
будет соответствовать несколько символов до X.