EOF ile eşleşecek normal ifade


92

Buna benzeyen bazı verilerim var

john, dave, chris
rick, sam, bob
joe, milt, paul

Bu normal ifadeyi isimlerle eşleştirmek için kullanıyorum

/(\w.+?)(\r\n|\n|,)/

hangi çoğunlukla çalışır ancak dosya uçları aniden son değerinin anlamı son söz de bitmiyor sonra \r\n, \nya ,da EOF ile biter. Normal ifadede EOF'yi eşleştirmenin bir yolu var mı, böylece onu ikinci gruplandırmaya doğru koyabilir miyim?


Bir gruptaki tüm isimleri mi yoksa isim başına bir yakalama grubunu mu yakalamaya çalışıyorsunuz?
Andrew Hare

Normal ifadeyle ilgili sorun yaşarken yapılacak bir şey, kalıbınızdaki öğeleri ayrı ayrı denemektir. Sondaki jetonla ilgili endişeleriniz varsa, ifadenizi onsuz test edin.
akf

harika bir regex test sitesi eklemek istedim: regexplanet.com/simple
northpole


@Sinan - Kabul ediyorum; birleştirildi
Marc Gravell

Yanıtlar:


163

Bu sorunun cevabı \Zanlamam biraz zaman aldı, ama şimdi işe yarıyor. Tersine, \Atüm dizenin başıyla eşleştiğini unutmayın (bir satırın başlangıcına karşılık ^ve bunun tersine $).


5
Bir için netbeans içinde böyle fonctionality sonra ise yukarı Sadece kafaları dosyaları aramak projeye bir karşıt olarak dosya arama , şu farklı davranır ... (\s*)\?>(\s*)\Z... ve biraz daha burada kazma sonra proje klasörüne ne işe yarar edilir : (\s*)\?>(\s*)(\n*)(\W)\Z Bilginize: bu, tüm kapanış php etiketlerini dosyanın sonundaki satır sonlarıyla değiştirmektir.
MediaVince

1
Çıkıyor \Ada bulmak ve değiştirmek Visual Studio çalışır. Her zaman olduğu gibi, bu tür şeyleri dikkatli kullanın, ancak mutlu olduğumda aslında doğru olanı yapacağımı bir kez manuel olarak karıştırmaktan kurtardı.
Steve Pettifer

Bir Scannerdosyanın tamamını aynı anda okumak için Java'nın sınıfını kullanırken; \Zsınırlayıcı olarak kullanırsam , sondaki satırsonu karakteri kırpılır. Sınırlayıcıyı olarak değiştirdiğimde \z, takip eden satırsonu karakteri korundu. Görünüşe göre Martin Dorey'nin cevabı Java için de geçerli.
mmdemirbas

24

EOF aslında bir karakter değildir. Çok satırlı bir dizeniz varsa, '$' dizenin sonuyla ve bir satırın sonuyla eşleşecektir.

Perl ve onun kardeşleri, içinde \Ave \Ztamamen bir satır sonu yok sayarak dize başlangıcını ve bitişini maç.

POSIX regexes kullanımına GNU uzantıları \`ve \'aynı şeyler için.


18

Visual Studio'da, EOF'yi şu şekilde bulabilirsiniz: $(?![\r\n]) . Bu, satır sonlarınız CR, CRLF veya sadece LF olsa da çalışır.

Bonus olarak, tüm kod dosyalarınızın aşağıdaki gibi son bir satırsonu işaretine sahip olmasını sağlayabilirsiniz:

               Find What: (?<![\r\n])$(?![\r\n])
            Replace With: \r\n
 Use Regular Expressions: checked
Look at these file types: *.cs, *.cshtml, *.js

Bu nasıl çalışır:

Önünde CR veya LF olmayan ve ayrıca CR veya LF gelmeyen herhangi bir satır sonunu (sıfır genişlikli eşleşme) bulun. Bazı düşünceler size bunun neden işe yaradığını gösterecek!

CR, LF veya CRLF gibi istediğiniz satır sonlandırma karakteriyle Değiştirmeniz gerektiğini unutmayın.


Visual Studio 2019'da, bununla hepsini değiştirmenin dosyanın sonuna iki yeni satırın eklenmesine neden olabileceği bir hata var. Sanırım kaydetme seçeneğinde otomatik olarak yeni satır ekle seçeneğiyle bir ilgisi var.
Stevoisiak

10

Ryan'ın önerdiği \ Z davranışını \ z ile karşılaştırın:

$ perl -we '$ corpus = "merhaba \ n"; $ külliyat = ~ s / \ Z / dünya / g; print (": $ corpus: \ n") '
:Selam Dünya
dünya:
$ perl -we '$ corpus = "merhaba \ n"; $ külliyat = ~ s / \ z / dünya / g; print (": $ corpus: \ n") '
:Merhaba
dünya:
$ 

perlre sez:

\ Z Yalnızca dizenin sonunda veya sondaki satırdan önce eşleşir
\ z Yalnızca dizenin sonunda eşleşir

Test senaryosunun Ruby'ye çevirisi (1.8.7, 1.9.2) aynı şekilde davranır.


4

Son zamanlarda bunun gibi bir şey arıyordum ama JavaScript için.

Bunu buraya koymak, böylece aynı sorunu yaşayan herkesin yararlanabilmesi için

var matchEndOfInput = /$(?![\r\n])/gm;

Temel olarak bu, satırın sonuyla eşleşir, bunu satır başı veya yeni satır karakterleri takip etmez. Özünde bu, \ZJavaScript ile aynıdır .


2

Çizgi ayırıcıları gerçekten yakalamak zorunda mısınız? Değilse, ihtiyacınız olan tek şey bu normal ifade olmalıdır:

/\w+/

Bu, eşleştirmek istediğiniz tüm alt dizelerin, örneğinizde olduğu gibi tamamen kelime karakterlerinden oluştuğunu varsayar.


2

Belki (\ r \ n | \ n) yerine $ (EOL / EOF) deneyebilirsiniz?

/\"(.+?)\".+?(\w.+?)$/

1

Dizgeyi bir bütün olarak ele almak için uygun değiştirici zorlamayı kullandığınızı varsayarak (satır satır değil - ve \ n sizin için çalışıyorsa, onu kullanıyorsunuz), başka bir alternatif ekleyin - dizenin sonu: (\ r \ n | \ n |, | $)


0

/(\w.+?)(\r\n|\n|,|$)/


5
Muhtemelen. Artık hatırlamıyorum :-)
küp
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.