Saat menulis jawaban ini , saya harus mencocokkan secara eksklusif pada linebreak alih-alih menggunakan s
-flag ( dotall
- dot match linebreaks).
Situs yang biasanya digunakan untuk menguji ekspresi reguler berperilaku berbeda ketika mencoba mencocokkan \n
atau \r\n
.
saya perhatikan
Regex101 hanya cocok dengan linebreak
\n
( contoh - hapus\r
dan cocok)RegExr cocok dengan linebreak tidak pada
\n
maupun pada\r\n
dan saya tidak dapat menemukan sesuatu untuk membuatnya cocok dengan linebreak, kecuali untukm
-flag dan\s
( contoh )Debuggex berperilaku lebih berbeda:
dalam contoh ini hanya cocok menyala\r\n
, sementara di
sini hanya cocok\n
, dengan bendera dan mesin yang sama ditentukan
Saya sepenuhnya menyadari m
-flag (multiline - ^
cocok dengan awal dan $
akhir baris), tetapi kadang-kadang ini bukan pilihan. Sama dengan \s
, karena cocok dengan tab dan spasi, juga.
Pemikiran saya untuk menggunakan karakter baris baru unicode ( \u0085
) tidak berhasil, jadi:
- Apakah ada cara yang gagal untuk mengintegrasikan pertandingan pada linebreak (lebih disukai terlepas dari bahasa yang digunakan) ke dalam ekspresi reguler?
- Mengapa situs yang disebutkan di atas berperilaku berbeda (terutama Debuggex, hanya cocok sekali
\n
dan sekali saja\r\n
)?
sumber
[\r\n]+
- atau sesuatu seperti ini\r?\n
untuk mencocokkan urutan terminasi\r\n
dan\n
garis. Ini tidak bekerja untuk\r
sintaks Mac lama , tetapi yang cukup langka hari ini.Jawaban:
Akan menjawab dalam arah yang berlawanan.
2) Untuk penjelasan lengkap tentang
\r
dan\n
saya harus merujuk ke pertanyaan ini, yang jauh lebih lengkap daripada yang akan saya posting di sini: Perbedaan antara \ n dan \ r?Singkatnya, Linux menggunakan
\n
baris baru, Windows\r\n
dan Mac lama\r
. Jadi ada beberapa cara untuk menulis baris baru. Alat kedua Anda (RegExr) misalnya cocok dengan tunggal\r
.1)
[\r\n]+
seperti yang disarankan Ilya akan berhasil, tetapi juga akan cocok dengan beberapa baris baru berturut-turut.(\r\n|\r|\n)
lebih benar.sumber
\r
/\n
yang tergantung pada sistem operasi - itu hal yang satu mungkin tahu (;)) - tapi kenapa dua debuggex-contoh cocok sekali pada \ r \ n dan sekali pada \ n? Setidaknya tidak ada perbedaan (dalam contoh) yang terlihat bagi saya.\r\n
dalam teks (jika Anda mengklik kanan dan menunjukkan sumber, Anda akan menemukan{{Infobox XC Championships\r\n|Name =
suatu tempat). Alat kedua ditulis dalam Flash dan saat Anda membaca halaman tentang sedikit buggy dengan karakter baris baru.(\r\n|\r|\n)
dapat ditulis lebih sederhana sebagai\r\n?
\n
Anda memiliki akhiran baris yang berbeda dalam teks contoh di Debuggex. Yang sangat menarik adalah bahwa Debuggex tampaknya telah mengidentifikasi gaya akhir baris mana yang Anda gunakan pertama kali, dan Debuggex mengonversi semua akhiran baris tambahan yang dimasukkan ke gaya itu.
Saya menggunakan Notepad ++ untuk menempelkan teks sampel dalam format Unix dan Windows ke dalam Debuggex, dan yang mana yang saya tempelkan dulu adalah sesi yang macet dengan Debuggex.
Jadi, Anda harus mencuci teks melalui editor teks Anda sebelum menempelkannya ke Debuggex. Pastikan Anda menempelkan gaya yang Anda inginkan. Debuggex default ke gaya Unix (\ n).
Juga, NEL (\ u0085) adalah sesuatu yang sepenuhnya berbeda: https://en.wikipedia.org/wiki/Newline#Unicode
(\r?\n)
akan mencakup Unix dan Windows. Anda akan membutuhkan sesuatu yang lebih kompleks, seperti(\r\n|\r|\n)
, jika Anda ingin mencocokkan Mac lama juga.sumber
Dalam
\R
pertandingan PCRE\n
,\r
dan\r\n
.sumber
(\r\n|\r|\n)
Ini hanya berlaku untuk pertanyaan 1.
Saya memiliki aplikasi yang berjalan di Windows dan menggunakan kotak editor MFC multi-line.
Kotak editor mengharapkan linebreak CRLF, tapi saya perlu menguraikan teks yang dimasukkan
dengan beberapa regex yang benar-benar besar / tidak menyenangkan '.
Saya tidak ingin menekankan hal ini saat menulis regex, jadi
saya akhirnya menormalkan bolak-balik antara parser dan editor sehingga
regex hanya menggunakan
\n
. Saya juga menjebak operasi tempel dan mengonversinya untuk kotak.Ini tidak memakan banyak waktu.
Inilah yang saya gunakan.
sumber
Dengan Python:
atau lebih ketat:
sumber