Çizgi çizgilerini eşleştir - \ n veya \ r \ n?


159

Bu yanıtı yazarken , s-flag ( dotall- dot match linebreaks) kullanmak yerine yalnızca linebreaks ile eşleşmek zorunda kaldım .

Normal ifadeleri test etmek için kullanılan siteler genellikle \nveya ile eşleşmeye çalışırken farklı davranır \r\n.

farkettim

  • Regex101 yalnızca satır satırlarıyla eşleşir \n
    ( örnek - sil \rve eşleşir)

  • RegExr, ne açık \n ne de açık satır çizgileriyle eşleşir \r\n
    ve m-flag ve \s
    ( örnek ) hariç, bir satır kesmesiyle eşleşmesi için bir şey bulamıyorum

  • Debuggex daha farklı davranır:
    in bu örnekte yalnızca maçları \r\nise
    burada sadece maçları \nbelirtilen aynı bayrakları ve motor ile,

m-Flag'ın (çok satırlı - bir satırın ^başlangıcı ve $bitişi ile eşleştiğini) tamamen biliyorum , ama bazen bu bir seçenek değil. İle aynı \sçok, sekmeler ve boşluklar maçları gibi.

Unicode newline karakterini ( \u0085) kullanmayı düşündüm , bu yüzden:

  1. Eşleşmeyi bir satır sonu (tercihen kullanılan dilden bağımsız olarak) düzenli bir ifadeye entegre etmenin güvenilir bir yolu var mı?
  2. Yukarıda belirtilen siteler neden farklı davranıyor (özellikle Debuggex, yalnızca bir kez \nve yalnızca bir kez eşleşiyor \r\n)?

15
Deneyebilirsiniz [\r\n]+- ya da bunun gibi bir şey
Iłya Bursov

3
Ben \r?\nher ikisini de \r\nve \nsatır sonlandırma dizilerini eşleştirmek için kullanıyorum . Eski \rMac sözdizimi için işe yaramaz , ancak bu günlerde oldukça nadirdir.
ridgerunner

6
Merhaba, ben debuggex'in kurucusuyum. Bu bir hata gibi görünüyor (debuggex için, diğerleri için konuşamam). Bu soruyu referans alan yüksek bir sorun ekledim. Mümkün olan en kısa sürede buna ulaşacağız - şu anda (çok sınırlı) tüm kaynaklarımızı başka bir ürün lanse etmeye odaklıyoruz.
Sergiu Toarca

2
@ridgerunner, Mac'in sözdizimini eklemek için (\ r? \ n | \ r), Peter van der Wal'un aşağıdaki cevabına benzer ancak daha kompakt (10 karakter ve 12 karakter) yapabilirsiniz.
Doktor J

Yanıtlar:


220

Ters yönde cevap vereceğim.

2) Hakkında tam bir açıklama için \rve \nben burada yayınlayacağımdan çok daha eksiksiz olan bu soruya başvurmak zorundayım: \ n ve \ r?

Uzun lafın kısası, Linux \nyeni hat, Windows \r\nve eski Mac'ler için kullanıyor \r. Yani bir satırsonu yazmanın birden fazla yolu var. İkinci aracınız (RegExr), örneğin tek parçada eşleşir \r.

1) [\r\n]+Ilya'nın önerdiği gibi çalışacak, aynı zamanda birbirini takip eden birçok yeni çizgiyle de eşleşecektir. (\r\n|\r|\n)daha doğrudur.


Öyleyse, \r/ \nişletim sistemine bağlı - bu kişinin bildiği bir şey (;)) - ama neden iki hata ayıklama örneği \ r \ n ve bir kez \ n ile eşleşiyor? En azından benim için hiçbir fark yok (örneklerde).
KeyNone

Büyük olasılıkla Windows metin düzenleyicinizden birini ve diğerini doğrudan debuggex textarea'ya kopyaladığınız için. Her biri farklı satır sonları kullandı.
OGHaza

1
Aslında, üçüncü örneğinizde (Kıdemli erkekler ...) \r\nmetinde bir vardır (sağ tıklayıp kaynağı gösterirseniz, bir {{Infobox XC Championships\r\n|Name =yerde bulacaksınız ). İkinci araç Flash'ta yazılmıştır ve sayfayı okurken yeni satır karakterleri ile biraz buggy.
Peter van der Wal

1
(\r\n|\r|\n)daha basit bir şekilde yazılabilir\r\n?
Asad Saeeduddin

2
@ AsadSaeeduddin Hayır yapamaz. Unix satır sonuyla eşleşmeyecek\n
Peter van der Wal

12

Debuggex'teki örnek metinlerde farklı satır sonlarınız var. Özellikle ilginç olan şey, Debuggex'in ilk önce hangi satır sonu stilini kullandığınızı belirlediği ve bu stile girilen tüm ek satır sonlarını dönüştürdüğü.

Unix ve Windows biçimindeki örnek metni Debuggex'e yapıştırmak için Notepad ++ kullandım ve hangisini ilk yapıştırdığım Debuggex oturumu neyle yapıştı.

Bu nedenle, metninizi Debuggex'e yapıştırmadan önce metin düzenleyiciniz aracılığıyla yıkamanız gerekir. İstediğiniz stili yapıştırdığınızdan emin olun. Hata ayıklama varsayılan olarak Unix stiline (\ n) sahiptir.

Ayrıca, NEL (\ u0085) tamamen farklı bir şeydir: https://en.wikipedia.org/wiki/Newline#Unicode

(\r?\n)Unix ve Windows'u kapsayacaktır. (\r\n|\r|\n)Eski Mac ile de eşleşmek istiyorsanız, daha karmaşık bir şeye ihtiyacınız olacak.


Debuggex hakkında çok ilginç bir nokta! Ayrıca, işaret ettiğiniz için teşekkürler \ u0085, orada yanıltıcı var!
KeyNone

3

PCRE'nin olarak \Reşleşir \n, \rve \r\n.


Hiç soru yok
Sandwell

1
@Sandwell: Üzgünüm, seni anlamıyorum, bu bir soru değil, bu bir cevap, daha basit(\r\n|\r|\n)
Toto

2

Bu sadece 1. soru için geçerlidir.

Windows üzerinde çalışan ve çok satırlı bir MFC düzenleyici kutusu kullanan bir uygulamam var.
Editör kutusu CRLF satır sonu bekler, ama
bazı gerçekten büyük / kötü regexs ile girilen metni ayrıştırmak gerekiyor '.


Normal
ifadeyi yazarken bu konuda stresli olmak istemedim, bu yüzden normal ifadelerin sadece kullanması için ayrıştırıcı ve editör arasında ileri geri normalleştim \n. Ayrıca macun işlemlerini yakalayıp kutuları için de dönüştürüyorum.

Bu çok zaman almaz.
Ben bunu kullanıyorum.

 boost::regex  CRLFCRtoLF (
     " \\r\\n | \\r(?!\\n) "
     , MODx);

 boost::regex  CRLFCRtoCRLF (
     " \\r\\n?+ | \\n "
     , MODx);


 // Convert (All style) linebreaks to linefeeds 
 // ---------------------------------------
 void ReplaceCRLFCRtoLF( string& strSrc, string& strDest )
 {
    strDest  = boost::regex_replace ( strSrc, CRLFCRtoLF, "\\n" );
 }

 // Convert linefeeds to linebreaks (Windows) 
 // ---------------------------------------
 void ReplaceCRLFCRtoCRLF( string& strSrc, string& strDest )
 {
    strDest  = boost::regex_replace ( strSrc, CRLFCRtoCRLF, "\\r\\n" );
 }

2

Python'da:

# as Peter van der Wal's answer
re.split(r'\r\n|\r|\n', text, flags=re.M) 

veya daha titiz:

# https://docs.python.org/3/library/stdtypes.html#str.splitlines
str.splitlines()
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.