Tidak bisa lepas dari garis miring terbalik dengan regex?

114

Saya menggunakan regex berikut

^[a-zA-Z0-9\',!;\?\$\^:\\\/`\|~&\" @#%\*\{}\(\)_\+\.\s=-]{1,1000}$

Saya tahu itu jelek, tapi sejauh ini memenuhi tujuannya selain garis miring terbalik tidak diizinkan seperti yang saya kira seharusnya karena lolos, saya juga mencoba \\alih-alih \\\tetapi hasil yang sama. Ada ide?

Eton B.
sumber
4
Saya baru saja memperbaiki kesalahan ketik pada judul, tetapi ada sesuatu yang sangat luar biasa tentang judul "Tidak dapat menghindari serangan balik dengan regex?" Memang!
Adam Crossland
1
@AdamCrossland Bukankah kita semua berharap regex dapat membantu kita menghindari serangan balik? > _>
Eton B.
2
Heck, saya hanya berharap saya bisa lepas dari serangan balik DARI regex.
Adam Crossland

Jawaban:

225

Jika Anda meletakkan ini dalam sebuah string di dalam sebuah program, Anda mungkin benar-benar perlu menggunakan empat garis miring terbalik (karena parser string akan menghapus dua di antaranya saat "melepaskan diri" untuk string tersebut , dan kemudian ekspresi reguler membutuhkan dua untuk escaped regex backslash).

Misalnya:

regex("\\\\")

diartikan sebagai ...

regex("\\" [escaped backslash] followed by "\\" [escaped backslash])

diartikan sebagai ...

regex(\\)

diartikan sebagai ekspresi reguler yang cocok dengan satu garis miring terbalik.


Bergantung pada bahasanya, Anda mungkin dapat menggunakan bentuk kutipan yang berbeda yang tidak mengurai urutan escape untuk menghindari penggunaan sebanyak mungkin - misalnya, dengan Python:

re.compile(r'\\')

Bagian rdepan tanda kutip menjadikannya string mentah yang tidak mengurai pelolosan garis miring terbalik.

Amber
sumber
14
hehe ... Saya baru saja mengalami ini dan perlu menambahkan tiga. Saya terus menambahkan garis miring terbalik sampai berhasil.
billynoah
ummm, mengapa regex ini ditafsirkan ulang dua kali, bukan sekali seperti yang seharusnya untuk PCRE?
Jim Michaels
3
@JimMichaels karena tidak semua bahasa memiliki literal regex yang tidak lolos, dan oleh karena itu terkadang bahasa pemrograman itu sendiri menafsirkan slash escape sekali dalam sintaks stringnya, dan string yang dihasilkan kemudian diteruskan ke mesin regex (yang menafsirkan slash escape dalam sintaks regex).
Amber
1
sekali, dahulu kala, saya harus menangkap sebuah xpath dari sebuah elemen yang satu-satunya fitur pengenalnya adalah path file windows, kemudian menghasilkan sebuah program (sebagai string) di mana xpaths akan direpresentasikan sebagai string. pada satu titik di langkah-langkah perantara, ada 8 garis miring terbalik yang digunakan untuk mewakili satu garis miring terbalik di jalur file. Itu yang tertinggi yang pernah saya dapatkan.
Zackkenyon
Ini bisa menjadi lebih berbelit-belit saat mencari garis miring terbalik bersama dengan pola yang memerlukan karakter meta. Ambil contoh, mencari garis miring terbalik diikuti dengan angka. Sekarang Anda akan menatap ekspresi berikut mencoba untuk mencari tahu apa yang terjadi: new RegExp('\\\\\\d');.
jabacchetta
15

Jika bukan literal, Anda harus menggunakan \\\\sehingga Anda mendapatkan \\yang berarti garis miring terbalik yang lolos.

Itu karena ada dua representasi. Dalam representasi string regex Anda, Anda memiliki "\\\\", Yang akan dikirim ke parser. Parser akan melihat \\yang diinterpretasikan sebagai garis miring terbalik yang valid (yang cocok dengan satu garis miring terbalik).

Vivin Paliath
sumber
10

Garis miring terbalik \adalah karakter pelolos untuk ekspresi reguler. Oleh karena itu, garis miring terbalik ganda memang berarti garis miring terbalik tunggal.

\ (backslash) followed by any of [\^$.|?*+(){} escapes the special character to suppress its special meaning.

ref: http://www.regular-expressions.info/reference.html

Brad
sumber
4

Dari http://www.regular-expressions.info/charclass.html :

Perhatikan bahwa satu-satunya karakter khusus atau karakter meta di dalam kelas karakter adalah tanda kurung tutup (]), garis miring terbalik (\\), tanda sisipan (^), dan tanda hubung (-). Karakter meta biasa adalah karakter normal di dalam kelas karakter, dan tidak perlu di-escape dengan garis miring terbalik. Untuk mencari bintang atau plus, gunakan [+ *]. Regex Anda akan berfungsi dengan baik jika Anda keluar dari metakarakter biasa di dalam kelas karakter, tetapi melakukannya secara signifikan mengurangi keterbacaan.

Untuk memasukkan garis miring terbalik sebagai karakter tanpa arti khusus di dalam kelas karakter, Anda harus menghindarinya dengan garis miring terbalik lainnya. [\\ x] cocok dengan garis miring terbalik atau x. Tanda kurung tutup (]), tanda sisipan (^), dan tanda hubung (-) dapat dimasukkan dengan mengosongkannya menggunakan garis miring terbalik, atau dengan menempatkannya pada posisi di mana keduanya tidak memiliki arti khusus. Saya merekomendasikan metode terakhir, karena ini meningkatkan keterbacaan. Untuk menyertakan tanda sisipan, letakkan di mana saja kecuali tepat setelah tanda kurung buka. [x ^] cocok dengan x atau tanda sisipan. Anda dapat meletakkan kurung tutup tepat setelah kurung tutup, atau tanda sisipan. [] x] cocok dengan kurung tutup atau x. [^] x] cocok dengan semua karakter yang bukan tanda kurung tutup atau x. Tanda hubung dapat dimasukkan tepat setelah kurung tutup, atau tepat sebelum kurung tutup, atau tepat setelah tanda sisipan.

Anda menulis regex dalam bahasa apa?

Nate
sumber
0

Solusi ini memperbaiki masalah saya saat mengganti tag br ke '\ n'.

alert(content.replace(/<br\/\>/g,'\n'));
hltsydmr.dll
sumber