Поиск и замена многострочных регулярных выражений!
Я ударился о стену. Кто-нибудь знает хороший текстовый редактор, который имеет поиск и замену как 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 !!!