Многострочные регулярные выражения в Visual Studio


87

Есть ли способ заставить Visual Studio выполнить замену регулярного выражения для нескольких строк (пусть совпадение пересекает границы)? Я знаю, что есть много редакторов, которые я могу использовать для этого, но кажется странным, что эта функция была исключена из Visual Studio. Я что-то упускаю?

Ответы:


25

Используйте диалог замены в файлах Ctrl- Shift- Hи параметр одной строки (?s):

(?s)start.*end

находит

start
two
three
end

Однострочный означает: каждый файл рассматривается как однострочный, точка .соответствует новой строке \n. Оборотная сторона: вы должны использовать « Найти все» и заменить все или заменить вручную. Найти дальше не получается.

Для немодального диалога Ctrl- Hи найдите следующий, используйте (.*\n)*для сопоставления любого количества строк:

start(.*\n)*.*end

В любом случае вы можете заменить свои результаты несколькими строками, вставив \n.


это работает, но вам нужен дополнительный вопросительный знак (раньше end), чтобы он не был жадным. то есть:start(.*\n)*.*?end
CAD парень

4
Жадная версия соответствует как можно большему количеству символов между startи end. Если вы хотите найти следующую endверсию (?s)start.*?end, используйте нежадную версию:, или start(.*\n)*?.*?end.
Стефан Штамм

Примечание для потенциальных пользователей: не работает с Visual Studio 2013. См. Ответ Джайлза Робертса.
relative_random

@relatively_random: Были ли у вас проблемы с использованием (?s)?
Stephan Stamm

Да. Это все еще работает для вас в более новых версиях VS?
relative_random

72

Регулярные выражения изменились в Visual Studio 2013 . https://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.120).aspx

Чтобы сопоставить выражение на двух строках, код теперь будет следующим:

StartOfExpression.*\r?\n.*EndOfExpression


Спасибо, это отлично работает, </label>.*\r?\n.*<divгде \r?\nочевидная carriage_return-new_line и .*для сопоставления возможных табуляции / пробелов
Сэм

Я получаю сообщение об ошибке «Литерал '\ n' в настоящее время не поддерживается»
ELI7VH

@ ELI7VH Я не могу воспроизвести вашу ошибку. Какую версию Visual Studio вы используете?
Giles Roberts

25

Это работает сегодня в Visual Studio 2012:

fooPatternToStart.*(.*\n)+?.*barPatternToEnd

Посмотрите, как (.*\n)+?деталь соответствует нескольким линиям, не жадно.
fooPatternToStart- это какой-то шаблон регулярного выражения в вашей начальной строке, а barPatternToEndваш шаблон можно найти в другой строке ниже, возможно, на многих строках ниже ...

Пример найден здесь .

Просто и эффективно :)

Примечание: до VS2012 работала схема:fooPatternToStart.(.\n)+@.*barPatternToEnd


4
обратите внимание, что Visual Studio 2012 использует тот же механизм регулярных выражений для поиска / замены, что и в коде, поэтому приведенное выше становится: fooPatternToStart. * (. * \ n) *?. * barPatternToEnd
Brent

@Brent: конечно, более поздние версии VSTO исправили эту проблему.
woohoo,

что, если я хочу найти текст между началом и остановкой? как это? : Edit: sprintf.*(.*\n)+?.*log.*(.*\n)+?.*__func__работает поиск logмежду sprintfи __func__, спасибо! Tho ... кажется, это смотрит в бесконечность для этого ... если бы только был способ ограничить количество строк
Gizmo

19

Примечание. В этом ответе используется синтаксис регулярного выражения, который использовался в Visual Studio до VS 2012 включительно. В VS 2013 и более поздних версиях синтаксис регулярного выражения был изменен.

Вы можете включить \nв выражение. В качестве примера, вот регулярное выражение, которое я использую для «очистки» автоматически сгенерированных сценариев SQL от всего, что не является хранимой процедурой (оно будет соответствовать текстовым блокам, которые начинаются со строки, содержащей «Object:», за которой следует что-то, что не является "StoredProcedure", затем сопоставление следующих строк до строки, состоящей из слова "GO"):

/\*+ Object\::b:b~(StoredProcedure)(.*\n)#GO\n

Примечание. Знак конца строки зависит от формата файла, поэтому используйте только \ n для текста в стиле Unix, \ r для текста в стиле Mac или \ r \ n для текста в стиле Windows.
Джеймс Уилкинс

2
Примечание II: убедитесь, что у вас не отмечена отметка «Соответствовать целому слову», иначе это не сработает!
Эд Грэм

1
Не могли бы вы добавить примечание, что этот ответ относится только к Visual Studio 2012 и старше, пожалуйста?
Джайлс Робертс

3

вам может потребоваться использовать \ r \ n в конце вашего выражения.


1

Нежадный многострочный захват любых символов, Visual Studio 2013+:

.*?\r?\n.*?

Жадная версия в ответе Джайлза Робертса.


0

Для всех, кто приходит сюда во время поиска VS Code, я использую это, чтобы сопоставить что угодно из scriptлюбого места с двумя символами новой строки (исключая новые строки):

script(.|\n)+?(?=\n\n)

заменить scriptи \n\nсопоставить все между ними.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.