Поиск и замена многострочных регулярных выражений!

Я ударился о стену. Кто-нибудь знает хороший текстовый редактор, который имеет поиск и замену как Notepad++, но также может сделать многострочный поиск и замену регулярных выражений? В принципе, я пытаюсь найти что-то, что может соответствовать регулярному выражению, например:

поиск oldlog(.*ns+([rn.]*));
заменить newlog()

какие идеи?

14 ответов


моя личная рекомендация-UltraEdit IDM Computing (www.ultraedit.com) - он может выполнять регулярные выражения (как поиск, так и замену) с синтаксисом Perl, Unix и UltraEdit. Многострочное сопоставление - одна из возможностей в режиме Perl regex в нем.

Он также имеет другие хорошие возможности поиска (e.g поиск в определенном диапазоне столбцов символов, поиск в нескольких файлах, история поиска, избранное поиска и т. д...)

alt-текст http://www.ultraedit.com/assets/images/new_features/ue_1500/searchincolumn.png


Notepad++ теперь может обрабатывать многострочные регулярные выражения (просто обновите до последней версии - функция была введена около марта '12).

мне нужно было удалить все операторы onmouseout и onmouseover из HTML-документа, и мне нужно было создать не-жадное многострочное совпадение.

onmouseover=.?\s*".*?"

убедитесь, что вы проверяем:

[ ] . matches newline
флажок, если вы хотите использовать возможность сопоставления нескольких строк.

Editpad Выступает Про имеет лучшие возможности регулярного выражения, чем любой другой редактор, который я когда-либо использовал.

кроме того, я подозреваю, что у вас ошибка в регулярном выражении - [\r\n.] будет соответствовать только возврата каретки, символы новой строки и полностью останавливается. Если вы пытаетесь сопоставить любой символ (например, " оператор точки плюс CR и LF), попробуйте [\s\S] вместо.


на Зевс редактор может делать мульти-строку поиск и замена.


Я использую затмение, который является бесплатным и что вы уже можете иметь, если вы разработчик. "\R " действует как независимый от платформы разделитель строк. Вот пример многострочного поиска:

найти:

\bibitem.(Р.\)?\R?{([^{])}$\R^([^\].[^}]$Р.\$Р.\)

заменить:

\defcitealias{$2}{$3}


Я уверен, что Notepad++ может сделать это сейчас через плагин TextFX (который включен по умолчанию). Нажмите Control-R в Notepad++ и играйте.


TextPad имеет хорошие возможности поиска и замены регулярных выражений; я использовал его некоторое время и очень доволен им.

скриншот TextPad http://i31.tinypic.com/2bb22q.png

с особенности:

мощный поиск / замена двигателя с помощью Регулярные выражения в стиле UNIX, с сила макросов редактора. Наборы файлы в дереве каталогов могут быть поиск, и текст можно заменить в все откройте документы сразу.

для большего количества вариантов, чем вам может понадобиться, проверьте"Notepad++ АльтернативыAlternativeTo.net.


вы можете использовать плагин Python Script для поиска и замены многострочных регулярных выражений! - http://npppythonscript.sourceforge.net/docs/latest/scintilla.html?highlight=pymlreplace#Editor.pymlreplace

# This example replaces any <br/> that is followed by another on the next line (with optional spaces in between), with a single one
editor.pymlreplace(r"<br/>\s*\r\n\s*<br/>", "<br/>\r\n")

Я использую Notepad++ все время, но это регулярное выражение всегда было немного не хватает.

Возвышенное Текст это то, что вы хотите.


EditPlus делает хорошую работу при поиске / замене с помощью regex (включая многострочный)


вы можете использовать Visual Studio. Скачайте Express бесплатно, если у вас нет копии.

регулярное выражение VS нестандартно, поэтому вам придется использовать \n:b+[\r\n] вместо этого.


последняя версия UltraEdit имеет многострочный поиск и замену с поддержкой регулярных выражений.

или если вы в порядке с использованием более специализированного инструмента регулярного выражения для этого, есть Regex Hero. У этого есть побочное преимущество-возможность делать все на лету. Другими словами, вам не нужно нажимать кнопку, чтобы проверить регулярное выражение, потому что оно автоматически проверяется после каждого нажатия клавиши.

лично я бы использовал UltraEdit, если Я ищу, чтобы заменить текст в нескольких файлах. Таким образом, я могу просто выбрать файлы для замены в виде пакета и нажать "заменить". Но если я работаю с одним текстовым файлом, и мне нужно написать более сложное регулярное выражение, я бы вставил его в Regex Hero и работал с ним там. Это потому, что Regex Hero может сэкономить время, когда вы видите, что все происходит в режиме реального времени.


ED for windows имеет две версии регулярного выражения, три вида вырезания и вставки (выделение, строки или блоки, и вы можете переходить от одного к другому (в отличие от ultra edit, который в лучшем случае неуклюжий) одним щелчком мыши, когда вы выделяете-нет необходимости тянуть вниз меню. Сама скорость выполнения работы невероятна, как чтение на Kindle, вам не нужно думать об этом.


вы можете использовать последнюю версию Notepad++ (мой 6.2.2).

нет необходимости использовать опцию ". матч newline", как предлагается в другом ответе. Вместо этого используйте адекватное регулярное выражение С ^ для " начала строки "и $ для"конца строки". Затем используйте \r\n после $ для "новой строки" в файле dos (или просто \n в файле unix, поскольку возврат каретки в основном используется для текстового файла dos/windows):

Ex.: удалить все строки, начинающиеся с тегов OBJE после начала строки с тегом UID (из файла gedcom-используется в генеалогии) я использовал следующее регулярное выражение поиска:

^UID (.*)$\r\n^(OBJE (.*)$\r\n)+

и следующее значение замены:

UID \r\n

это соответствующие строки, как это:

UID 4FBB852FB485B2A64DE276675D57A1BA
OBJE @M4@
OBJE @M3@
OBJE @M2@
OBJE @M1@

и выход замены

UID 4FBB852FB485B2A64DE276675D57A1BA

550 экземпляров были заменены менее чем за 1 сек. Notepad++ действительно эффективен!

в противном случае для проверки регулярного выражения мне нравится использовать тестер регулярных выражений .Net (http://regexhero.net/tester/). Это здорово писать и тестировать на лету Рег экс...

PS.: Кроме того, вы можете использовать [\s\S] в вашем регулярном выражении, чтобы соответствовать любому символу, включая новые строки. Итак, если вы ищете любой блок "многострочного" текста, начиная с " xxx "и заканчивая" abc", следующее регулярное выражение будет в порядке:^xxx[\s\S]*?abc$ здесь "*?" должен соответствовать как можно меньше между xxx и abc !!!