Многострочные регулярные выражения в 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сопоставить все между ними.

Али Тоу
источник