Багаторядкові регулярні вирази у 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.
Stephan Stamm

Примітка для потенційних користувачів: не працює з Visual Studio 2013. Див. Відповідь Джайлза Робертса.
relatively_random

@relatively_random: Ви мали проблеми з використанням (?s)?
Stephan Stamm

Так. Чи все ще це працює для вас у новіших версіях VS?
relatively_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 та .*відповідність можливим вкладкам / пробілам
Сем


@ ELI7VH Я не можу повторити вашу помилку. Яку версію Visual Studio ви використовуєте?
Джайлс Робертс,

25

Це працює сьогодні у Visual Studio 2012:

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

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

Приклад можна знайти тут .

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

Примітка: до VS2012 шаблон, який працював, був:fooPatternToStart.(.\n)+@.*barPatternToEnd


4
note Visual Studio 2012 використовує той самий механізм регулярного виразу для пошуку / заміни, що і в коді, тому вищезгадане стає: fooPatternToStart. * (. * \ n) *?. * barPatternToEnd
Brent

@Brent: надано, новіші версії VSTO виправили цю проблему.
woohoo

що робити, якщо я хочу шукати текст конкретно між пуском і зупинкою? подобається це? : Edit: sprintf.*(.*\n)+?.*log.*(.*\n)+?.*__func__працює для пошуку logміж sprintfта __func__, дякую! Тобто, здається, це дивиться в нескінченність .. якби існував спосіб обмежити кількість рядків
Gizmo

19

Примітка: ця відповідь використовує синтаксис регулярних виразів, що використовується у Visual Studio до VS 2012 включно. У VS 2013 та пізніших версіях синтаксис регулярних виразів змінився.

Ви можете включити \n у вираз. Як приклад, ось регулярний вираз, який я використовую для "очищення" автоматично згенерованих сценаріїв SQL від усього, що не є збереженою процедурою (воно буде відповідати текстовим блокам, що починаються з рядка, що містить "Об'єкт:", після чого щось не є "StoredProcedure", а потім відповідність наступним рядкам до рядка складається зі слова "GO"):

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

Примітка: Термінатор рядка залежить від формату файлу, тому використовуйте лише \ n для тексту стилю Unix, \ r для тексту стилю Mac або \ r \ n для тексту стилю Windows.
Джеймс Уілкінс,

2
Примітка II: переконайтеся, що у вас не встановлено позначку "Зібрати ціле слово" одночасно, інакше це не спрацює!
Ед Грем

1
Чи можете ви додати примітку, що ця відповідь стосується лише Visual Studio 2012 та старіших версій?
Giles Roberts

3

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


1

Нежадливий багаторядковий захоплення будь-якого символу, Visual Studio 2013+:

.*?\r?\n.*?

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


0

Для всіх, хто приходить сюди під час пошуку коду VS, я використовую це для зіставлення будь-чого з scriptбудь-якого місця з 2 новими рядками (нові рядки виключаються):

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

замінювати scriptі \n\nзбігати все між собою.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.