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

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

search oldlog\(.*\n\s+([\r\n.]*)\);
заменить newlog\(\1\)

Любые идеи?

Ответ 1

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

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

alt text http://www.ultraedit.com/assets/images/new_features/ue_1500/searchincolumn.png

Ответ 2

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

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

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

Убедитесь, что вы установите флажок:

[ ] . matches newline
, если хотите использовать возможность многострочного совпадения.

Ответ 3

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

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

Ответ 4

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

Поиск:

\ RBibitem. (\ R.)?\R? {([^ {])} $\ R ^ ([^ \]. [^}] $​​\ R. $\ R.)

и замените:

\ defcitealias {$ 2} {3} $

Ответ 5

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

Ответ 6

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

Снимок экрана TextPad http://i31.tinypic.com/2bb22q.png

Из Features:

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

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

Ответ 7

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

Ответ 9

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

Sublime Text - это то, что вы хотите.

Ответ 10

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

Ответ 11

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

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

Ответ 12

В последней версии UltraEdit есть многострочный поиск и замена w/regex.

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

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

Ответ 13

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

Ответ 14

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

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

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

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

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

UID \1\r\n

Это соответствующие строки:

UID 4FBB852FB485B2A64DE276675D57A1BA
OBJE @[email protected]
OBJE @[email protected]
OBJE @[email protected]
OBJE @[email protected]

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

UID 4FBB852FB485B2A64DE276675D57A1BA

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

В противном случае, чтобы проверить регулярное выражение, мне нравится использовать .Net RegEx Tester (http://regexhero.net/tester/). Это действительно здорово писать и проверять на лету Reg Ex...

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