Normal ifadede nasıl hata ayıklarsınız? [kapalı]


149

Düzenli ifadeler oldukça karmaşık hale gelebilir. Beyaz alanın olmaması onları okumayı zorlaştırır. Bir hata ayıklayıcı ile düzenli bir ifade olsa adım olamaz. Peki uzmanlar karmaşık düzenli ifadeleri nasıl ayıklıyorlar?


2
Normal ifadenizi "test etmenin" "hata ayıklama" dan çok daha önemli olduğuna inanıyorum. Genellikle sonuca oldukça kolay bir şekilde bakarak (veya cevaplarda önerilen araçlardan birini kullanarak) bir regex ile neler olduğunu anlayabilirsiniz, ancak ne demek istediğinizi gerçekten emin olmak için, regex'inizi olası tüm sınır durumlarıyla test etmelisiniz. Test sonunda gerçekten ne yapmak istediğinizi açıklığa kavuşturacak ve hata ayıklamayı işe yaramaz hale getirecektir :)
baol

7
Bu ilginç görünüyor: http://www.debuggex.com/ (Soru kapalı olduğundan gerçek bir cevap ekleyemiyorum.)
KajMagnus

Visual Studio'nuz varsa, sorunlu alanınızın yakınında bir kesme noktası ayarlayabilirsiniz (örn:, RegEx.Replace(...)'Anında pencere'ye geçin ve 'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)bu sorunu hızla sıfırlamak için birkaç komutu deneyin .
DeepSpace101

2
Çok şaşırdım kimse söz görünüyor olduğum regex101.com bir olan gerçek ayıklayıcısını ve web barındırılan sıra.
mechalynx

1
2017'de bile, regexbuddy'nin hala bulabileceğim en iyi araç olduğuna ve fiyatın 40 $ 'da kaldığına inanıyorum. Genellikle farklı regex lezzeti ile farklı dillerde çalışıyorum, bu yüzden sık sık kafam karışıyor. Regexbuddy ile, sadece beni sözdiziminden kurtarır
code4j

Yanıtlar:


68

RegexBuddy'yi satın alır ve yerleşik hata ayıklama özelliğini kullanırsınız . Yılda iki defadan fazla regexes ile çalışıyorsanız, bu parayı kısa sürede tasarruf ettireceksiniz. RegexBuddy ayrıca basit ve karmaşık düzenli ifadeler oluşturmanıza ve hatta kodu sizin için çeşitli dillerde oluşturmanıza yardımcı olacaktır.

alternatif metin

Ayrıca, geliştiriciye göre, bu araç WINE ile kullanıldığında Linux'ta neredeyse kusursuz çalışır .


31
Çok kötü, sadece Windows ve 40 ABD doları.
kennytm

25
Geliştiriciye göre Linux üzerinde WINE üzerinden çalışır: regexbuddy.com/wine.html . Ve yaklaşık 40 $ maliyeti ... zamanınızın değeri nedir?
Mick

18
Bu bir özgür yazılım değil.
codeholic

38
Kim söylendi ya da istendi?
Tim Pietzcker

21
Mick'in dediği gibi, zamanınızın değeri nedir? "Paranın satın alabileceği en iyi araçlar" her zaman paraya mal olmak zorunda değildir, ancak bazen yaparlar. Ayrıca, JGSoft , olağanüstü kullanıcı hizmeti ile sürekli olarak mükemmel kalitede ürünler geliştirir . Onlardan gerçekten ihtiyaç duymadığım bir yazılım bile aldım (RegexMagic gibi) çünkü onları desteklemek ve iş yerinde tutmak istiyorum. Ne kaçırdığını bilmiyorsun. Ciddi anlamda.
Tim Pietzcker

52

Perl ile 5.10 use re 'debug';,. (Veya debugcolorYığın Taşması üzerindeki çıktıyı düzgün biçimlendiremiyorum.)

$ perl -Mre = hata ayıklama -e '"foobar" = ~ / (.) \ 1 /'
REx "(.) \ 1" derleniyor
Final programı:
   1: AÇIK1 (3)
   3: REG_ANY (4)
   4: KAPAT1 (6)
   6: REF1 (8)
   8: SON (0)
minlen 1
REx "(.) \ 1" ile "foobar" eşleştiriliyor
   0 <> <foobar> | 1: OPEN1 (3)
   0 <> <foobar> | 3: REG_ANY (4)
   1 <f> <oobar> | 4: CLOSE1 (6)
   1 <f> <oobar> | 6: REF1 (8)
                                  başarısız oldu...
   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: SON (0)
Maç başarılı!
Boşaltma REx: "(.) \ 1"

Ayrıca, daha okunabilir hale getirmek için normal ifadelere boşluk ve yorumlar ekleyebilirsiniz. Perl'de bu, /xdeğiştirici ile yapılır . İle pcre, orada PCRE_EXTENDEDbayrak.

"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", ...);

12
+1: Neden kimse Regexbuddy'yi tercih eder ki?
Charles Stewart

1
Ben regex dostum daha iyi olduğunu düşünüyorum rağmen bu yöntemi seviyorum.
kale

yankı "foobar" | egrep "(.) \ 1"
DmitrySandalov

30

Unutmamak için bir tane daha ekleyeceğim: debuggex

İyi çünkü çok görsel: Debuggex regex yardımcısının fotoğrafı


debuggex aslında benim için çalışmıyor: Yazı tipleri JavaScript tarafından zorlanıyor ve görünüşe göre çalışmıyor (tek aralıklı yazı tiplerim var, firefox konsolu bunları mükemmel bir şekilde kullanıyor). Sonuç olarak ekran kullanılamaz. Ayrıca, JavaScript testi, tarayıcıyı her sürüm için çok sayıda test vakasıyla kapatır (tetiklendiğinde yalnızca bir kez değil). Son olarak, önerilen bazı normal ifadeler hatalıdır ve istendiği gibi eşleşmez.
7heo.tk

28

Bir normal ifadeye takılı kaldığımda genellikle buna dönüyorum: https://regexr.com/

Bir şeyin yanlış gittiğini hızlı bir şekilde test etmek için mükemmeldir.


1
Bu araç gerçekten yararlı: web'de barındırılıyor, bu yüzden yükleme yok, gerçek zamanlıdır, bu nedenle hata ayıklama bir rüyadır ve hatta bir şey hatırlayamamanız durumunda yararlı araç ipuçları ve özel karakterlerin bir listesi vardır. Mükemmel, çok teşekkürler
Jason Ridge

Ne yazık ki, bu araç (hala) regex sınırlayıcılarını değiştirmenize izin vermez (PCRE motoru için bile) - bunlar /(eğik çizgiler) olarak sabitlenir . Bu benim için bir showtopper.
MrWhite

19

Kullandığım Kodos - Python Normal İfade Debugger'ı:

Kodos, Python programlama dili için düzenli ifadeler oluşturmak, test etmek ve hata ayıklamak için kullanılan bir Python GUI yardımcı programıdır. Kodos, Python'da düzenli ifadeler verimli ve zahmetsizce geliştirmek için herhangi bir geliştiriciye yardımcı olmalıdır. Python'un düzenli ifadeleri uygulaması PCRE standardına dayandığından , Kodos, PCRE standardına (Perl, PHP, vb.) De uyan diğer programlama dillerindeki geliştiricilere fayda sağlamalıdır.

(...)

alternatif metin

Linux, Unix, Windows, Mac üzerinde çalışır.


2
Kodos gerçek hata ayıklama özellikleri sağlamaz. Normal ifadeye adım atamaz veya yürütmeyi duraklatamazsınız.
candide

Mac'te çalışmasını sağlamak için herhangi bir ipucu var mı? Sourceforge sitesi Mac için yükleme hakkında herhangi bir bilgi sunmuyor ve Google-fu'm beni başarısız yapıyor gibi görünüyor.
Adam Parkin

Bu Python2 gibi görünse de ve 2006'dan beri (14 yıl önce yazılırken) güncellenmedi mi?
MrWhite

13

Bence değil. Normal ifadeniz çok karmaşıksa ve bir hata ayıklayıcıya ihtiyacınız olan nokta için sorunluysa, belirli bir ayrıştırıcı oluşturmanız veya başka bir yöntem kullanmanız gerekir. Çok daha okunabilir ve bakımı kolay olacaktır.


4
Dostum, bunu normal ifade ekran görüntüsüne baktıktan sonra mı gönderdin?
kale

2
Herkes buna katılmayacak, ama bu kötü bir fikir değil. Herkes regex motorunun muazzam regex'lerle en verimli olduğunu varsayar. Bu mutlaka doğru değildir ve kesinlikle okunması kolay değildir. Normal ifadelerinizi parçalayın.
Dan Rosenstark

1
@ Michael Brooks: Hayır, daha önce, aslında. Ekran görüntüsünü gördükten sonra, bir normal ifadede hata ayıklayabileceğiniz konusunda iyiyim. Ama benim fikrim üzerinde duruyorum: normal ifade çok karmaşık hale geldiğinde, başka bir yolla değişme zamanı.
Valentin Rocher

12

Mükemmel bir ücretsiz araç var, Regex Coach . En son sürüm yalnızca Windows için kullanılabilir; yazarı Dr. Edmund Weitz, Linux sürümünü korumayı bıraktı çünkü çok az kişi indirdi, ancak indirme sayfasında Linux için daha eski bir sürüm var.


8

Az önce yaratıcısı Damian Conway tarafından Regexp :: Debugger'ın bir sunumunu gördüm. Çok etkileyici şeyler: Yerinde veya bir komut satırı aracı (rxrx) kullanarak, etkileşimli olarak veya "günlüğe kaydedilen" yürütme dosyasında (JSON'da depolanır), herhangi bir noktada ileri ve geri adım atma, kesme noktalarında veya olaylarda durma, renkli çıktı (kullanıcı tarafından yapılandırılabilir ), optimizasyon için regexp ve string üzerinde ısı haritaları vb.

CPAN'da ücretsiz olarak kullanılabilir: http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm


OP, "Hata ayıklayıcı ile düzenli bir ifadeyle adım atamıyorum" dedi.
kuantum

Sunuma bağlantınız var mı?
kale



6

Normal ifadelerimi kendi gözlerimle ayıklarım. Bu yüzden /xdeğiştirici kullanıyorum, onlar için yorum yazıyorum ve bunları parçalara ayırıyorum. Hızlı ve okunabilir düzenli ifadelerin nasıl geliştirileceğini öğrenmek için Jeffrey Friedl'in Mastering Regular Expressions'ı okuyun . Çeşitli regex hata ayıklama araçları sadece voodoo programlamayı kışkırtır.


5

Bana gelince ben genellikle herhangi bir regex bayt kodunu dökebilir pcretest yardımcı programı kullanın ve genellikle (en azından benim için) okumak çok daha kolaydır. Misal:

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





2

PCRE'ler gibi bir gösterim kullanarak reg exes yazmak, montajcı yazmak gibidir: Kafanızdaki ilgili sonlu durum otomatalarını görebilmeniz iyi olur, ancak çok hızlı bir şekilde bakımı zorlaşabilir.

Bir hata ayıklayıcı kullanmamanın nedenleri, bir programlama diliyle bir hata ayıklayıcı kullanmamakla aynıdır: yerel hataları düzeltebilirsiniz, ancak ilk önce yerel hataları yapmanıza neden olan tasarım sorunlarını çözmenize yardımcı olmazlar. yer.

Daha yansıtıcı yol, programlama dilinizde normal ifadeler oluşturmak için veri temsillerini kullanmak ve bunları oluşturmak için uygun soyutlamalara sahip olmaktır. Olin Shiver'ın düzen regexp notasyonuna girişi, bu veri sunumlarını tasarlarken karşılaşılan sorunlara mükemmel bir genel bakış sağlar.


Ayrıştırıcı birleştiriciler gerçekten harika bir yoldur: Haskell'deki Parsec ve PArrows, Ruby'de rsec, C ++ 'da Boost Spirit, Python'da PyParsing, Perl6 :: Perl'de Kurallar, vb.
ephemient

2

Sıklıkla pcretest kullanıyorum - neredeyse bir "hata ayıklayıcı" ama sadece metin SSH bağlantısı üzerinde çalışıyor ve tam olarak ihtiyacım olan regex lehçesini ayrıştırıyor: (C ++) kodum libpcre'ye bağlanıyor, bu yüzden sihirde ve nede küçük farklılıklarla ilgili bir zorluk yok değil vs.

Genel olarak yukarıda regex hata ayıklayıcı ihtiyacı bir kod kokusu olan adam ile katılıyorum. Benim için regex'leri kullanmanın en zor yanı genellikle regex'in kendisi değil, onları çalıştırmak için gereken çoklu alıntı katmanlarıdır.





0

Benim için, regex göz küresi yaptıktan sonra (oldukça akıcı olduğumdan ve neredeyse her zaman / x veya eşdeğeri kullandığım gibi), bazı dejenere eşleşmelere (yani aşırı geri izleyen bir şey) çarpıp basmayacağımdan emin olup olmadığımı test etmek yerine hata ayıklayabilirim. örneğin bir operatörün açgözlülüğünü değiştirerek bu tür sorunları çözüp çözemeyeceğimizi görmek için

Bunu yapmak için, yukarıda belirtilen yöntemlerden birini kullanırdım: pcretest, RegexBuddy (geçerli işyerim lisansladıysa) veya benzeri ve bazen C # regexes çalışıyorum eğer Linqpad zaman.

(Perl numarası benim için yeni bir şey, bu yüzden muhtemelen regex araç setime ekleyeceğim.)

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.