Visual Studio'da çok satırlı normal ifadeler


87

Visual Studio'nun birden çok satırda normal ifade değişimi gerçekleştirmesini sağlamanın herhangi bir yolu var mı (eşleşmenin sınırlar arası olmasına izin verin)? Bunun için kullanabileceğim birçok editör olduğunu biliyorum, ancak bu özelliğin Visual Studio'nun dışında bırakılmış olması garip görünüyor. Bir şey mi kaçırıyorum?

Yanıtlar:


24

Dosyalarda değiştir iletişim kutusunu Ctrl- Shift- Hve tek satır seçeneğini kullanın (?s):

(?s)start.*end

bulur

start
two
three
end

Tek satır şu anlama gelir: her dosya tek satır olarak kabul edilir, nokta .satırsonu ile eşleşir \n. Dezavantajı: Tümünü Bul'u kullanmalı ve hepsini değiştirmeli veya elle değiştirmelisiniz. Sonrakini bul çalışmıyor.

Kipli olmayan iletişim kutusu için Ctrl- Hve sonrakini bul, (.*\n)*herhangi bir sayıda satırı eşleştirmek için kullanın :

start(.*\n)*.*end

Her iki durumda da bulgularınızı ekleyerek birden çok satırla değiştirebilirsiniz \n.


bu işe yarıyor ancak fazladan soru işareti (daha önce end) istiyorsunuz, bu yüzden açgözlü değil. yani:start(.*\n)*.*?end
CAD bloke

4
Açgözlü versiyon, startve arasında olabildiğince çok karakterle eşleşir end. Bir sonrakini bulmak istiyorsanız, endaçgözlü olmayan sürümü kullanın: (?s)start.*?endveya start(.*\n)*?.*?end.
Stephan Stamm

Olası kullanıcılar için not: Visual Studio 2013'ten beri çalışmıyor. Giles Roberts'ın cevabına bakın.
nispeten_random

@relently_random: Kullanmakta sorun yaşadınız mı (?s)?
Stephan Stamm

Evet yaptım. Yeni VS sürümlerinde hala sizin için çalışıyor mu?
nispeten_random

72

Visual Studio 2013'te normal ifadeler değişti . https://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.120).aspx

Bir ifadeyi iki satırda eşleştirmek için kod şu şekilde olacaktır:

StartOfExpression.*\r?\n.*EndOfExpression


Teşekkürler, bu mükemmel çalışıyor , bariz carriage_return-new_line </label>.*\r?\n.*<divnerede ve olası sekmeleri / boşlukları eşleştirmek için\r?\n.*
Sam

"Birebir '\ n' şu anda desteklenmiyor"
hatasını alıyorum

@ ELI7VH Hatanızı çoğaltamıyorum. Visual Studio'nun hangi sürümünü kullanıyorsunuz?
Giles Roberts

25

Bu, bugün Visual Studio 2012'de çalışır:

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

(.*\n)+?Açgözlü olmayan bir şekilde , parçanın birden çok satırda nasıl eşleştiğini görün .
fooPatternToStartbaşlangıç ​​çizginizdeki bazı normal ifade kalıbı, barPatternToEndaşağıdaki başka bir satırda, muhtemelen birçok satırın altında bulunan kalıbınız ...

Örnek burada bulundu .

Basit ve etkili :)

Not: VS2012'den önce , işe yarayan model şuydu:fooPatternToStart.(.\n)+@.*barPatternToEnd


4
note visual studio 2012, bul / değiştir için kodun içinde olduğu gibi aynı normal ifade motorunu kullanır, dolayısıyla yukarıdakiler şöyle olur: fooPatternToStart. * (. * \ n) *?. * barPatternToEnd
Brent

@Brent: Verildi, VSTO'nun daha yeni sürümleri bu sorunu çözdü.
woohoo

özellikle başlangıç ​​ve bitiş arasında bir metin aramak istersem ne olur? bunun gibi? : Düzenle: ve arasında sprintf.*(.*\n)+?.*log.*(.*\n)+?.*__func__arama yapmaya çalışır , teşekkürler! Tho .. bunun için sonsuzluğa bakıyor gibi görünüyor .. eğer sadece çizgi miktarını sınırlamanın bir yolu olsaydılogsprintf__func__
Gizmo

19

Not: Bu yanıt, VS 2012'ye kadar ve dahil olmak üzere Visual Studio'da kullanılan normal ifade sözdizimini kullanıyor. VS 2013 ve sonraki sürümlerde, normal ifade sözdizimi değişti.

İfadeye dahil edebilirsiniz \n. Örnek olarak, burada otomatik olarak oluşturulan SQL komut dosyalarını saklı yordam olmayan herhangi bir şeyden "temizlemek" için kullandığım bir normal ifade ("Object:" içeren bir satırla başlayan ve ardından olmayan bir şey gelen metin bloklarıyla eşleşecektir. "StoredProcedure", ardından aşağıdaki satırların bir satırla eşleştirilmesi "GO" kelimesinden oluşur):

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

Not: Satır sonlandırıcı dosyanın formatına bağlıdır, bu nedenle yalnızca Unix stili metin için \ n, Mac stili metin için \ r veya Windows stili metin için \ r \ n kullanın.
James Wilkins

2
Not II: Aynı anda "Tüm kelimeyi eşleştir" seçeneğini işaretlemediğinizden emin olun, aksi takdirde bu işe yaramaz!
Ed Graham

1
Bu cevabın yalnızca Visual Studio 2012 ve daha eski sürümler için geçerli olduğunu belirten bir not ekleyebilir misiniz lütfen?
Giles Roberts

3

ifadenizin sonunda \ r \ n kullanmanız gerekebilir.


1

Açgözlü olmayan çok satırlı herhangi bir karakter yakalama, Visual Studio 2013+:

.*?\r?\n.*?

Giles Roberts'ın cevabında açgözlü versiyon.


0

VS Kodunu ararken buraya gelen herkes için, bunu scriptherhangi bir yerden herhangi bir yerde 2 yeni satırla eşleştirmek için kullanıyorum (yeni satırlar hariç):

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

değiştirin scriptve \n\naralarındaki her şeyi eşleştirin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.