Wielowierszowe wyrażenia regularne w programie Visual Studio

87

Czy istnieje sposób, aby program Visual Studio wykonał zamianę wyrażenia regularnego w wielu wierszach (pozwól dopasować granice między wierszami)? Wiem, że jest wiele edytorów, których mogę do tego użyć, ale wydaje się dziwne, że ta funkcja została pominięta w programie Visual Studio. Czy coś mi brakuje?

Paul Keister
źródło

Odpowiedzi:

25

Użyj okna dialogowego zamień w plikach Ctrl- Shift- Hi opcji pojedynczej linii (?s):

(?s)start.*end

znajdzie

start
two
three
end

Singleline oznacza: każdy plik jest traktowany jako pojedyncza linia, kropka .pasuje do nowej linii \n. Wada: musisz użyć funkcji Znajdź wszystko i zamienić wszystko lub wymienić ręcznie. Funkcja Znajdź następny nie działa.

W przypadku niemodalnego okna dialogowego Ctrl- Hi znajdź następny, użyj (.*\n)*do dopasowania dowolnej liczby wierszy:

start(.*\n)*.*end

Tak czy inaczej, możesz zastąpić swoje wyniki wieloma wierszami, wstawiając \n.

Stephan Stamm
źródło
to działa, ale potrzebujesz dodatkowego znaku zapytania (przed end), więc nie jest chciwy. tj .:start(.*\n)*.*?end
CAD bloke
4
Wersja chciwa dopasowuje jak najwięcej znaków między starta end. Jeśli chcesz znaleźć następną, endużyj niechcianej wersji:, (?s)start.*?endlub start(.*\n)*?.*?end.
Stephan Stamm
Uwaga dla przyszłych użytkowników: nie działa od wersji Visual Studio 2013. Zobacz odpowiedź Gilesa Robertsa.
stosunkowo_random
@relatively_random: Czy miałeś problem z używaniem (?s)?
Stephan Stamm
Tak. Czy to nadal działa w nowszych wersjach VS?
stosunkowo_random
72

Wyrażenia regularne uległy zmianie w programie Visual Studio 2013 . https://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.120).aspx

Aby dopasować wyrażenie w dwóch wierszach, kod wyglądałby teraz:

StartOfExpression.*\r?\n.*EndOfExpression

Giles Roberts
źródło
Dziękuję, to działa idealnie, </label>.*\r?\n.*<divgdzie \r?\njest oczywista carriage_return-new_line i .*za dopasowanie możliwych tabulatorów / spacji
Sam
Pojawia
@ ELI7VH Nie mogę powtórzyć twojego błędu. Jakiej wersji programu Visual Studio używasz?
Giles Roberts
25

Działa to dzisiaj w programie Visual Studio 2012:

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

Zobacz, jak (.*\n)+?część pasuje do wielu linii, nie jest chciwa.
fooPatternToStartto jakiś wzorzec wyrażenia regularnego w linii początkowej, a barPatternToEndwzór do znalezienia w innym wierszu poniżej, prawdopodobnie w wielu wierszach poniżej ...

Przykład znaleziony tutaj .

Prosty i skuteczny :)

Uwaga: przed VS2012 działał wzór:fooPatternToStart.(.\n)+@.*barPatternToEnd

woohoo
źródło
4
note Visual Studio 2012 używa tego samego silnika wyrażeń regularnych do znajdowania / zastępowania, co w kodzie, więc powyższy kod to: fooPatternToStart. * (. * \ n) *?. * barPatternToEnd
Brent
@Brent: oczywiście, nowsze wersje VSTO rozwiązały ten problem.
woohoo,
co jeśli chcę wyszukać tekst między początkiem a zakończeniem? lubię to? : Edycja: sprintf.*(.*\n)+?.*log.*(.*\n)+?.*__func__wyszukuje logmiędzy sprintfi __func__, dzięki! Jednak… wydaje się, że patrzy w nieskończoność… gdyby tylko istniał sposób na ograniczenie liczby linii
Gizmo
19

Uwaga: ta odpowiedź używa składni wyrażenia regularnego używanej w programie Visual Studio do wersji VS 2012 włącznie. W wersji VS 2013 i nowszych składnia wyrażenia regularnego uległa zmianie.

Możesz uwzględnić \nw wyrażeniu. Jako przykład, tutaj jest wyrażenie regularne, którego używam do „czyszczenia” automatycznie generowanych skryptów SQL z wszystkiego, co nie jest procedurą składowaną (dopasuje bloki tekstowe rozpoczynające się wierszem zawierającym „Obiekt:”, po którym następuje coś, co nie jest „StoredProcedure”, a następnie dopasowywanie następujących wierszy do wiersza składa się ze słowa „GO”):

/\*+ Object\::b:b~(StoredProcedure)(.*\n)#GO\n
Fredrik Mörk
źródło
Uwaga: Terminator linii zależy od formatu pliku, więc używaj tylko \ n dla tekstu w stylu Unix, \ r dla tekstu w stylu Mac lub \ r \ n dla tekstu w stylu Windows.
James Wilkins
2
Uwaga II: upewnij się, że nie masz zaznaczonego „Dopasuj całe słowo” w tym samym czasie, w przeciwnym razie to nie zadziała!
Ed Graham,
1
Czy możesz dodać uwagę, że ta odpowiedź dotyczy tylko programu Visual Studio 2012 i starszych?
Giles Roberts
3

może być konieczne użycie \ r \ n na końcu wyrażenia.

Keng
źródło
1

Non-chciwy wielowierszowy przechwytywanie dowolnego znaku, Visual Studio 2013+:

.*?\r?\n.*?

Wersja chciwa w odpowiedzi Gilesa Robertsa.

Miauczeć
źródło
0

Dla wszystkich, którzy szukają VS Code, używam tego, aby dopasować wszystko z scriptdowolnego miejsca z 2 nowymi wierszami (z wyłączeniem nowych linii):

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

zastąpić scripti \n\ndopasować wszystko między nimi.

Ali Tou
źródło