Ekspresi reguler bisa menjadi sangat kompleks. Minimnya ruang putih membuat mereka sulit dibaca. Saya tidak bisa melangkah melalui ekspresi reguler dengan debugger. Jadi, bagaimana para ahli men-debug ekspresi reguler yang kompleks?
Saya percaya bahwa "menguji" regex Anda jauh lebih penting daripada "debugging" itu. Anda biasanya dapat mengetahui apa yang terjadi dengan regex dengan mudah melihat hasilnya (atau menggunakan salah satu alat yang disarankan dalam jawaban), tetapi untuk benar-benar yakin itu melakukan apa yang Anda maksud, Anda harus menguji regex Anda dengan semua kasus perbatasan yang mungkin. Pengujian pada akhirnya akan mengklarifikasi apa yang benar-benar ingin Anda lakukan dan membuat proses debug tidak berguna :)
baol
7
Ini sepertinya menarik: http://www.debuggex.com/ (Karena pertanyaan ditutup, saya tidak dapat menambahkan jawaban nyata.)
KajMagnus
Jika Anda memiliki Visual Studio, Anda dapat mengatur breakpoint di dekat area masalah Anda (misalnya RegEx.Replace(...):, beralih ke 'Jendela langsung' dan coba beberapa 'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)perintah untuk dengan cepat nol dalam masalah ini.
DeepSpace101
2
Saya sangat terkejut tidak ada yang tampaknya telah menyebutkan regex101.com yang memiliki debugger aktual dan juga web-host.
mechalynx
1
bahkan pada tahun 2017, saya percaya regexbuddy masih merupakan alat terbaik yang dapat saya temukan, dan harganya tetap di $ 40. Saya sering bekerja pada bahasa yang berbeda dengan rasa regex yang berbeda, jadi saya sering bingung. Dengan regexbuddy, itu hanya membebaskan saya dari sintaks
code4j
Jawaban:
68
Anda membeli RegexBuddy dan menggunakan fitur debug bawaannya . Jika Anda bekerja dengan regex lebih dari dua kali setahun, Anda akan menghasilkan uang ini kembali dalam waktu singkat. RegexBuddy juga akan membantu Anda membuat ekspresi reguler yang sederhana dan kompleks, dan bahkan menghasilkan kode untuk Anda dalam berbagai bahasa.
Sayang sekali hanya untuk Windows dan harganya US $ 40.
kennytm
25
Ini berjalan di Linux melalui WINE, menurut pengembang: regexbuddy.com/wine.html . Dan tentang biaya $ 40 ... berapa nilai waktu Anda?
Mick
18
Ini bukan perangkat lunak bebas.
codeholic
38
Siapa bilang itu atau minta?
Tim Pietzcker
21
Seperti kata Mick, berapa nilai waktu Anda? "Alat terbaik yang dapat dibeli dengan uang" tidak selalu harus mengeluarkan biaya, tetapi kadang-kadang memang perlu. Plus, JGSoft konsisten mengembangkan besar produk-produk berkualitas dengan layanan pengguna yang luar biasa. Saya bahkan telah membeli perangkat lunak dari mereka yang saya tidak benar-benar butuhkan (seperti RegexMagic) karena saya ingin mendukung mereka dan menjaga mereka dalam bisnis. Anda tidak tahu apa yang Anda lewatkan. Serius.
Tim Pietzcker
52
Dengan Perl 5.10 use re 'debug';,. (Atau debugcolor, tapi saya tidak bisa memformat output dengan benar di Stack Overflow.)
Anda juga dapat menambahkan spasi putih dan komentar ke regex agar lebih mudah dibaca. Dalam Perl, ini dilakukan dengan /xpengubah. Dengan pcre, ada PCRE_EXTENDEDbenderanya.
"foobar"=~/(.)# any character, followed by a
\1 # repeat of previously matched character/x;
pcre *pat = pcre_compile("(.) # any character, followed by a\n""\\1 # repeat of previously matched character\n",
PCRE_EXTENDED,...);
pcre_exec(pat, NULL,"foobar",...);
debuggex sebenarnya tidak bekerja untuk saya: font-font tersebut diberlakukan oleh JavaScript, tampaknya, dan gagal berfungsi (saya memiliki font monospace, konsol firefox menggunakannya dengan sempurna). Akibatnya tampilan tidak dapat digunakan. Selain itu, pengujian JavaScript hang browser dengan banyak kasus pengujian, untuk setiap edisi (tidak hanya sekali ketika dipecat). Akhirnya, beberapa regex yang diusulkan disadap dan tidak cocok dengan yang dimaksudkan.
7heo.tk
28
Ketika saya terjebak pada regex saya biasanya beralih ke ini:
https://regexr.com/
Sempurna untuk menguji dengan cepat di mana ada masalah.
Alat ini sangat berguna: di-host di web jadi tidak ada penginstalan, ini waktu nyata sehingga debugging adalah mimpi, dan bahkan memiliki tooltip yang berguna dan daftar karakter khusus, jika Anda tidak dapat mengingat sesuatu. Ini sempurna, terima kasih banyak
Jason Ridge
Sayangnya, alat ini (masih) tidak memungkinkan Anda untuk mengubah pembatas regex (bahkan untuk mesin PCRE) - mereka ditetapkan sebagai /(garis miring). Ini adalah showstopper bagi saya.
MrWhite
19
Saya menggunakan Kodos - Debugger Ekspresi Reguler Python:
Kodos adalah utilitas Python GUI untuk membuat, menguji dan men-debug ekspresi reguler untuk bahasa pemrograman Python. Kodos harus membantu pengembang mana pun untuk mengembangkan ekspresi reguler dengan Python secara efisien dan mudah. Karena implementasi ekspresi reguler Python didasarkan pada standar PCRE , Kodos harus menguntungkan pengembang dalam bahasa pemrograman lain yang juga mematuhi standar PCRE (Perl, PHP, dll ...).
Kodos tidak menyediakan fitur debug yang sebenarnya. Anda tidak dapat melangkah regex atau menghentikan eksekusi.
Candide
Adakah kiat untuk mengaktifkannya di Mac? Situs Sourceforge tidak menawarkan info tentang cara menginstal untuk Mac, dan Google-fu saya tampaknya membuat saya gagal.
Adam Parkin
Meskipun ini tampaknya Python2, dan belum diperbarui sejak 2006 (14 tahun yang lalu pada saat penulisan)?
MrWhite
13
Saya pikir mereka tidak. Jika regexp Anda terlalu rumit, dan bermasalah hingga Anda membutuhkan debugger, Anda harus membuat parser tertentu, atau menggunakan metode lain. Itu akan jauh lebih mudah dibaca dan dipelihara.
Bung, Anda memposting ini setelah melihat cuplikan layar regexbuddy?
benteng
2
Semua orang akan tidak setuju dengan ini, tetapi itu bukan ide yang buruk. Semua orang berasumsi bahwa mesin regex paling efisien dengan regex yang sangat besar. Ini belum tentu benar, dan jelas tidak mudah dibaca. Hancurkan regex Anda.
Dan Rosenstark
1
@Michael Brooks: Tidak, sebelumnya, sebenarnya. Setelah melihat tangkapan layar, saya setuju dengan fakta bahwa Anda BISA men-debug regexp. Tapi saya berdiri pada ide saya: ketika regexp menjadi terlalu rumit, saatnya untuk berubah ke cara lain.
Valentin Rocher
12
Ada alat gratis yang luar biasa, Pelatih Regex . Versi terbaru hanya tersedia untuk Windows; penulisnya Dr. Edmund Weitz berhenti mempertahankan versi Linux karena terlalu sedikit orang yang mengunduhnya, tetapi ada versi yang lebih lama untuk Linux pada halaman unduhan.
Saya baru saja melihat presentasi Regexp :: Debugger oleh penciptanya: Damian Conway. Hal-hal yang sangat mengesankan: berjalan di tempat atau menggunakan alat baris perintah (rxrx), secara interaktif atau pada file eksekusi "dicatat" (disimpan di JSON), melangkah maju dan mundur di titik mana pun, berhenti di breakpoints atau peristiwa, keluaran berwarna (dapat dikonfigurasi pengguna) ), memanaskan peta pada regexp dan string untuk optimasi, dll ...
Saya men-debug regex saya dengan mata saya sendiri. Itu sebabnya saya menggunakan /xpengubah, menulis komentar untuk mereka dan membaginya menjadi beberapa bagian. Baca Jeffrey Friedl's Mastering Regular Expressions untuk mempelajari cara mengembangkan ekspresi reguler yang cepat dan mudah dibaca. Berbagai alat debugging regex baru saja memprovokasi pemrograman voodoo.
Sedangkan bagi saya, saya biasanya menggunakan utilitas pcretest yang dapat membuang kode byte regex apa pun, dan biasanya jauh lebih mudah dibaca (setidaknya untuk saya). Contoh:
PCRE version 8.30-PT1 2012-01-01
re>/ab|c[de]/iB
------------------------------------------------------------------07Bra3/i ab
738Alt10/i c
12[DEde]4545Ket48End------------------------------------------------------------------
Jika saya merasa mandek, saya ingin mundur dan membuat regex langsung dari teks sampel menggunakan txt2re (walaupun saya biasanya men-tweak regex yang dihasilkan dengan tangan).
Menulis rege menggunakan notasi seperti PCRE sama seperti menulis assembler: tidak apa-apa jika Anda bisa melihat automata keadaan terbatas yang sesuai di kepala Anda, tetapi bisa jadi sulit untuk mempertahankannya dengan sangat cepat.
Alasan untuk tidak menggunakan debugger hampir sama dengan karena tidak menggunakan debugger dengan bahasa pemrograman: Anda dapat memperbaiki kesalahan lokal, tetapi mereka tidak akan membantu Anda memecahkan masalah desain yang membuat Anda membuat kesalahan lokal di pertama tempat.
Cara yang lebih reflektif adalah dengan menggunakan representasi data untuk menghasilkan regexps dalam bahasa pemrograman Anda, dan memiliki abstraksi yang tepat untuk membangunnya. Pengantar Olin Shiver pada notasi regexp skema-nya memberikan gambaran yang sangat baik tentang masalah yang dihadapi dalam merancang representasi data ini.
Combinators Parser memang cara yang luar biasa: Parsec dan PArrows di Haskell, rsec di Ruby, Boost Spirit di C ++, PyParsing dengan Python, Perl6 :: Rules in Perl, dll.
ephemient
2
Saya sering menggunakan pcretest - bukan "debugger" tetapi berfungsi melalui koneksi SSH hanya teks dan mem-parsing persis dialek regex yang saya butuhkan: tautan kode (C ++) saya ke libpcre, jadi tidak ada kesulitan dengan perbedaan halus dalam apa sihir dan apa tidak, dll.
Secara umum saya setuju dengan orang di atas yang memerlukan debugger regex adalah bau kode. Bagi saya yang paling sulit menggunakan regex biasanya bukan regex itu sendiri, tetapi beberapa lapisan kutipan diperlukan untuk membuatnya bekerja.
Bagi saya, setelah melihat bola mata regex (karena saya cukup lancar, dan hampir selalu menggunakan / x atau setara), saya mungkin men-debug daripada menguji jika saya tidak yakin apakah saya akan menemukan beberapa pencocokan yang merosot (yaitu sesuatu yang berlebihan backtracks) untuk melihat apakah saya bisa menyelesaikan masalah seperti itu dengan memodifikasi keserakahan operator misalnya.
Untuk melakukan itu, saya akan menggunakan salah satu metode yang disebutkan di atas: pcretest, RegexBuddy (jika tempat kerja saya saat ini melisensikannya) atau serupa, dan kadang-kadang saya mengatur waktu di Linqpad jika saya bekerja di C # regexes.
(Trik perl adalah yang baru bagi saya, jadi mungkin akan menambahkan itu ke perangkat regex saya juga.)
RegEx.Replace(...)
:, beralih ke 'Jendela langsung' dan coba beberapa'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)
perintah untuk dengan cepat nol dalam masalah ini.Jawaban:
Anda membeli RegexBuddy dan menggunakan fitur debug bawaannya . Jika Anda bekerja dengan regex lebih dari dua kali setahun, Anda akan menghasilkan uang ini kembali dalam waktu singkat. RegexBuddy juga akan membantu Anda membuat ekspresi reguler yang sederhana dan kompleks, dan bahkan menghasilkan kode untuk Anda dalam berbagai bahasa.
Juga, menurut pengembang, alat ini berjalan hampir tanpa cela di Linux ketika digunakan dengan WINE .
sumber
Dengan Perl 5.10
use re 'debug';
,. (Ataudebugcolor
, tapi saya tidak bisa memformat output dengan benar di Stack Overflow.)Anda juga dapat menambahkan spasi putih dan komentar ke regex agar lebih mudah dibaca. Dalam Perl, ini dilakukan dengan
/x
pengubah. Denganpcre
, adaPCRE_EXTENDED
benderanya.sumber
Saya akan menambahkan yang lain sehingga saya tidak melupakannya: debuggex
Itu bagus karena sangat visual:
sumber
Ketika saya terjebak pada regex saya biasanya beralih ke ini: https://regexr.com/
Sempurna untuk menguji dengan cepat di mana ada masalah.
sumber
/
(garis miring). Ini adalah showstopper bagi saya.Saya menggunakan Kodos - Debugger Ekspresi Reguler Python:
Berjalan di Linux, Unix, Windows, Mac.
sumber
Saya pikir mereka tidak. Jika regexp Anda terlalu rumit, dan bermasalah hingga Anda membutuhkan debugger, Anda harus membuat parser tertentu, atau menggunakan metode lain. Itu akan jauh lebih mudah dibaca dan dipelihara.
sumber
Ada alat gratis yang luar biasa, Pelatih Regex . Versi terbaru hanya tersedia untuk Windows; penulisnya Dr. Edmund Weitz berhenti mempertahankan versi Linux karena terlalu sedikit orang yang mengunduhnya, tetapi ada versi yang lebih lama untuk Linux pada halaman unduhan.
sumber
Saya baru saja melihat presentasi Regexp :: Debugger oleh penciptanya: Damian Conway. Hal-hal yang sangat mengesankan: berjalan di tempat atau menggunakan alat baris perintah (rxrx), secara interaktif atau pada file eksekusi "dicatat" (disimpan di JSON), melangkah maju dan mundur di titik mana pun, berhenti di breakpoints atau peristiwa, keluaran berwarna (dapat dikonfigurasi pengguna) ), memanaskan peta pada regexp dan string untuk optimasi, dll ...
Tersedia di CPAN gratis: http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm
sumber
Saya menggunakan alat online ini untuk men-debug regex saya:
https://www.regextester.com/
Tapi ya, itu tidak bisa mengalahkan RegexBuddy.
sumber
Saya men-debug regex saya dengan mata saya sendiri. Itu sebabnya saya menggunakan
/x
pengubah, menulis komentar untuk mereka dan membaginya menjadi beberapa bagian. Baca Jeffrey Friedl's Mastering Regular Expressions untuk mempelajari cara mengembangkan ekspresi reguler yang cepat dan mudah dibaca. Berbagai alat debugging regex baru saja memprovokasi pemrograman voodoo.sumber
Sedangkan bagi saya, saya biasanya menggunakan utilitas pcretest yang dapat membuang kode byte regex apa pun, dan biasanya jauh lebih mudah dibaca (setidaknya untuk saya). Contoh:
sumber
Saya menggunakan:
http://regexlib.com/RETester.aspx
Anda juga dapat mencoba Regex Hero (menggunakan Silverlight):
http://regexhero.net/tester/
sumber
Jika saya merasa mandek, saya ingin mundur dan membuat regex langsung dari teks sampel menggunakan txt2re (walaupun saya biasanya men-tweak regex yang dihasilkan dengan tangan).
sumber
Jika Anda pengguna Mac, saya baru saja menemukan yang ini:
http://atastypixel.com/blog/reginald-regex-explorer/
Ini gratis, dan mudah digunakan, dan sudah sangat membantu bagi saya untuk memahami RegEx secara umum.
sumber
Lihat alat (tidak gratis) di regular-expressions.info . RegexBuddy pada khususnya. Ini adalah posting Jeff Atwood tentang masalah ini .
sumber
Menulis rege menggunakan notasi seperti PCRE sama seperti menulis assembler: tidak apa-apa jika Anda bisa melihat automata keadaan terbatas yang sesuai di kepala Anda, tetapi bisa jadi sulit untuk mempertahankannya dengan sangat cepat.
Alasan untuk tidak menggunakan debugger hampir sama dengan karena tidak menggunakan debugger dengan bahasa pemrograman: Anda dapat memperbaiki kesalahan lokal, tetapi mereka tidak akan membantu Anda memecahkan masalah desain yang membuat Anda membuat kesalahan lokal di pertama tempat.
Cara yang lebih reflektif adalah dengan menggunakan representasi data untuk menghasilkan regexps dalam bahasa pemrograman Anda, dan memiliki abstraksi yang tepat untuk membangunnya. Pengantar Olin Shiver pada notasi regexp skema-nya memberikan gambaran yang sangat baik tentang masalah yang dihadapi dalam merancang representasi data ini.
sumber
Saya sering menggunakan pcretest - bukan "debugger" tetapi berfungsi melalui koneksi SSH hanya teks dan mem-parsing persis dialek regex yang saya butuhkan: tautan kode (C ++) saya ke libpcre, jadi tidak ada kesulitan dengan perbedaan halus dalam apa sihir dan apa tidak, dll.
Secara umum saya setuju dengan orang di atas yang memerlukan debugger regex adalah bau kode. Bagi saya yang paling sulit menggunakan regex biasanya bukan regex itu sendiri, tetapi beberapa lapisan kutipan diperlukan untuk membuatnya bekerja.
sumber
Saya sering menggunakan rubular regexp tester berbasis Ruby
dan juga di Emacs gunakan M-x re-builder
Firefox juga memiliki ekstensi yang bermanfaat
sumber
Saya menggunakan Rx Toolkit yang disertakan dengan ActiveState Komodo .
sumber
Anda bisa mencoba yang ini http://www.pagecolumn.com/tool/regtest.htm
sumber
Bagi saya, setelah melihat bola mata regex (karena saya cukup lancar, dan hampir selalu menggunakan / x atau setara), saya mungkin men-debug daripada menguji jika saya tidak yakin apakah saya akan menemukan beberapa pencocokan yang merosot (yaitu sesuatu yang berlebihan backtracks) untuk melihat apakah saya bisa menyelesaikan masalah seperti itu dengan memodifikasi keserakahan operator misalnya.
Untuk melakukan itu, saya akan menggunakan salah satu metode yang disebutkan di atas: pcretest, RegexBuddy (jika tempat kerja saya saat ini melisensikannya) atau serupa, dan kadang-kadang saya mengatur waktu di Linqpad jika saya bekerja di C # regexes.
(Trik perl adalah yang baru bagi saya, jadi mungkin akan menambahkan itu ke perangkat regex saya juga.)
sumber