Bagaimana Anda men-debug regex? [Tutup]

149

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?

benteng
sumber
2
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.

teks alternatif

Juga, menurut pengembang, alat ini berjalan hampir tanpa cela di Linux ketika digunakan dengan WINE .

Mick
sumber
31
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.)

$ perl -Mre = debug -e '"foobar" = ~ / (.) \ 1 /'
Kompilasi REx "(.) \ 1"
Program akhir:
   1: OPEN1 (3)
   3: REG_ANY (4)
   4: CLOSE1 (6)
   6: REF1 (8)
   8: AKHIR (0)
minlen 1
Mencocokkan REx "(.) \ 1" dengan "foobar"
   0 <> <foobar> | 1: OPEN1 (3)
   0 <> <foobar> | 3: REG_ANY (4)
   1 <f> <oobar> | 4: CLOSE1 (6)
   1 <f> <oobar> | 6: REF1 (8)
                                  gagal...
   1 <f> <oobar> | 1: OPEN1 (3)
   1 <f> <oobar> | 3: REG_ANY (4)
   2 <fo> <obar> | 4: CLOSE1 (6)
   2 <fo> <obar> | 6: REF1 (8)
   3 <foo> <bar> | 8: AKHIR (0)
Pertandingan berhasil!
Membebaskan REx: "(.) \ 1"

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", ...);
singkat
sumber
12
+1: Mengapa ada yang lebih suka Regexbuddy daripada ini?
Charles Stewart
1
Saya suka metode ini, meskipun saya pikir regex sobat lebih baik.
benteng
echo "foobar" | egrep "(.) \ 1"
DmitrySandalov
30

Saya akan menambahkan yang lain sehingga saya tidak melupakannya: debuggex

Itu bagus karena sangat visual: Foto pembantu regex Debuggex

kevin
sumber
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.

thaiko
sumber
1
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 ...).

(...)

teks alternatif

Berjalan di Linux, Unix, Windows, Mac.

Thivent Pascal
sumber
2
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.

Valentin Rocher
sumber
4
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.

APC
sumber
8

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

Yves
sumber
OP berkata, "Saya tidak bisa melangkah melalui ekspresi reguler dengan debugger."
kuantum
Apakah Anda memiliki tautan ke presentasi?
benteng
3
@Rook, Anda dapat melihat presentasi di youtube.com/watch?v=zcSFIUiMgAs
Starfish
6

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.

codeholic
sumber
5

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
------------------------------------------------------------------
  0   7 Bra
  3  /i ab
  7  38 Alt
 10  /i c
 12     [DEde]
 45  45 Ket
 48     End
------------------------------------------------------------------
dark100
sumber
3

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).

sintaks telur
sumber
2

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.

Charles Stewart
sumber
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.

Bernd Jendrissek
sumber
0

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.)

ChrisF
sumber