Захват одного экземпляра поиска по регулярному выражению

194
Justin Jarrett

Я пытаюсь использовать Regex для поиска между началом отчета и началом следующего отчета далее по тому же файлу, захватить отчет целиком, а затем использовать его для поиска дубликатов и их удаления.

Они разбиты по спискам CRLF, и я подумал, что умен, собирая (\r\n).*(\r\n)отчет, находя, удаляя, повторяя для следующего отчета.

Когда я делаю (\r\n).*(\r\n)это захватывает от следующего CRLF до последнего CRLF в файле.

Я не могу понять, как ограничить поиск только одним экземпляром первой строки отчета, ~ 30 строками тела, а затем концом отчета.

0
Ваша проблема в том, что точка соответствует новой строке. Попробуйте снять флажок «точка соответствует новой строке». Который в блокноте ++ может быть не трудно найти .. barlop 6 лет назад 0
Пожалуйста, [отредактируйте] и добавьте пример данных, если вы хотите получить конкретный ответ. DavidPostill 6 лет назад 1
@DavidPostill Вполне возможно, что его понимание находится на уровне, когда ему не нужно задавать вопрос, который слишком специфичен для его конкретного случая. И вопросы, которые очень специфичны для случая человека, часто менее полезны для других. Похоже, он сам каким-то образом решил проблему и только что столкнулся с новой строкой. Таким образом, он мог бы преодолеть это, и если у него все еще есть проблемы, тогда он мог бы задать другой вопрос, и он выучил бы лучше таким образом. Я бы не поощрял его против этого. barlop 6 лет назад 0

1 ответ на вопрос

1
barlop

Ваша проблема в том, что точка соответствует новой строке. Попробуйте снять флажок «точка соответствует новой строке». Который в 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.

Большое спасибо, Барлоп! Аргумент [^ \ r \ n]. *? \ R \ n оказался именно тем, что мне нужно. Объяснение того, что "." а также '?' действительно помог. Justin Jarrett 6 лет назад 0
@JustinJarrett то, что вы предложили, является своего рода гибридным подходом, а не одним из моих примеров. Логика, лежащая в основе моих примеров, немного яснее, чем логика, лежащая в основе вашего примера, но если она работает, то она работает. barlop 6 лет назад 0

Похожие вопросы