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


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

5 66

5 ответов:

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

(?s)start.*end

находит

start
two
three
end

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

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

start(.*\n)*.*end

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

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

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

StartOfExpression.*\r?\n.*EndOfExpression

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

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

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

пример здесь.

простой и эффективный :)

Примечание: до в VS2012, шаблон, который работал: fooPatternToStart.(.\n)+@.*barPatternToEnd

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

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

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

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