आप एक रेगेक्स डिबग कैसे करते हैं? [बन्द है]


149

नियमित अभिव्यक्ति काफी जटिल हो सकती है। सफेद स्थान की कमी से उन्हें पढ़ना मुश्किल हो जाता है। मैं हालांकि डिबगर के साथ एक नियमित अभिव्यक्ति नहीं कर सकता। तो विशेषज्ञ जटिल नियमित अभिव्यक्तियों को कैसे डिबग करते हैं?


2
मेरा मानना ​​है कि "डीबगिंग" की तुलना में आपका रेगेक्स "परीक्षण" बहुत महत्वपूर्ण है। आप आमतौर पर यह पता लगा सकते हैं कि रिजेक्स के साथ क्या हो रहा है, जो परिणाम को आसानी से देख रहा है (या उत्तरों में सुझाए गए किसी एक उपकरण का उपयोग करके), लेकिन वास्तव में यह सुनिश्चित करने के लिए कि इसका मतलब है कि आपको सभी संभावित सीमा मामलों के साथ अपने रेगेक्स का परीक्षण करना चाहिए। परीक्षण अंततः स्पष्ट करेगा कि आप वास्तव में क्या करना चाहते हैं और डिबगिंग को बेकार कर दें :)
baol

7
यह दिलचस्प लगता है: http://www.debuggex.com/ (चूंकि प्रश्न बंद है मैं एक वास्तविक उत्तर नहीं जोड़ सकता।)
काजाग्नस

यदि आपके पास विजुअल स्टूडियो है, तो आप अपनी समस्या क्षेत्र के पास एक ब्रेकपॉइंट सेट कर सकते हैं (उदाहरण के लिए: RegEx.Replace(...)'तत्काल विंडो पर स्विच करें' और 'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)समस्या में जल्दी शून्य होने के लिए कुछ कमांड का प्रयास करें ।
DeepSpace101

2
मुझे बहुत आश्चर्य हुआ कि किसी को भी ऐसा प्रतीत नहीं होता कि regex101.com ने एक वास्तविक डिबगर का उल्लेख किया है और वह वेब-होस्ट भी है।
मेकलेनक्स

1
2017 में भी, मेरा मानना ​​है कि रेगेक्सबुडी अभी भी सबसे अच्छा उपकरण है जिसे मैं पा सकता हूं, और कीमत $ 40 है। मैं अक्सर विभिन्न भाषाओं में अलग-अलग रेगेक्स स्वाद के साथ काम करता हूं, इसलिए मैं अक्सर भ्रमित हो जाता हूं। रेगेक्सबुडी के साथ, यह मुझे सिंटैक्स से मुक्त करता है
कोड 4 जे

जवाबों:


68

आप RegexBuddy खरीदते हैं और इसके अंतर्निहित डीबग सुविधा का उपयोग करते हैं । यदि आप वर्ष में दो बार से अधिक रेग्जेस के साथ काम करते हैं, तो आप इस पैसे को कुछ ही समय में बचा लेंगे। RegexBuddy आपको सरल और जटिल नियमित अभिव्यक्ति बनाने में मदद करेगा, और यहां तक ​​कि विभिन्न भाषाओं में आपके लिए कोड भी उत्पन्न करेगा।

वैकल्पिक शब्द

डेवलपर के अनुसार, यह उपकरण WINE के साथ उपयोग किए जाने पर लिनक्स पर लगभग त्रुटिपूर्ण चलता है ।


31
बहुत बुरा यह केवल विंडोज है और यूएस $ 40 का खर्च आता है।
19

25
यह डेवलपर के अनुसार WINE के माध्यम से Linux पर चलता है: regexbuddy.com/wine.html । और $ 40 लागत के बारे में ... आपका समय कितना है?
मिक

18
यह फ्री सॉफ्टवेयर नहीं है।
कोडहोल

38
यह किसने कहा या इसके लिए पूछा गया था?
टिम पीत्ज़ेकर

21
खैर, जैसे मिक ने कहा, आपका समय कितना है? "सबसे अच्छे उपकरण पैसे खरीद सकते हैं" हमेशा पैसे खर्च करने की ज़रूरत नहीं है, लेकिन कभी-कभी वे करते हैं। इसके अलावा, JGSoft लगातार असाधारण उपयोगकर्ता सेवा के साथ महान गुणवत्ता वाले उत्पादों को विकसित करता है । मैंने उनसे सॉफ्टवेयर भी खरीदा है, जिसकी मुझे वास्तव में आवश्यकता नहीं है (जैसे रेगेक्समैजिक) क्योंकि मैं उनका समर्थन करना चाहता हूं और उन्हें व्यवसाय में रखना चाहता हूं। आप नहीं जानते कि आप क्या याद कर रहे हैं। गंभीरता से।
टिम पीत्ज़ेकर

52

Perl 5.10 के साथ, use re 'debug';। (या debugcolor, लेकिन मैं स्टैक ओवरफ्लो पर आउटपुट को ठीक से फॉर्मेट नहीं कर सकता।)

$ perl -Mre = debug -e '"foobar" = ~ / (।) \ 1 /'
संकलन REx "(।) \"
अंतिम कार्यक्रम:
   1: OPEN1 (3)
   3: REG_ANY (4)
   4: CLOSE1 (6)
   6: REF1 (8)
   8: END (0)
मीनल १
मैचिंग REx "(।)" 1 "के खिलाफ" फोब्बर "
   0 <> <फोबार> | 1: OPEN1 (3)
   0 <> <फोबार> | 3: REG_ANY (4)
   1 <f> <oobar> | 4: CLOSE1 (6)
   1 <f> <oobar> | 6: REF1 (8)
                                  अनुत्तीर्ण होना...
   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> <बार> | 8: अंत (0)
मैच सफल!
नि: शुल्क रेक्स: "(?) \ 1"

इसके अलावा, आप उन्हें अधिक पठनीय बनाने के लिए regexes में व्हॉट्सएप और टिप्पणियां जोड़ सकते हैं। पर्ल में, यह /xसंशोधक के साथ किया जाता है । के साथ pcre, PCRE_EXTENDEDध्वज है।

"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: कोई भी रेगेक्सबुडी को क्यों पसंद करेगा?
चार्ल्स स्टुअर्ट

1
मुझे यह तरीका पसंद है, भले ही मुझे लगता है कि रेगेक्स दोस्त बेहतर है।
बदमाश

इको "फोब्बर" | egrep "(।) \ 1"
दिमित्रीसंडलोव 12

30

मैं एक और जोड़ूंगा ताकि मैं इसे भूल न जाऊं : debuggex

यह बहुत अच्छा है क्योंकि यह बहुत दृश्य है: डेब्यूगेक्स रेगेक्स हेल्पर की तस्वीर


debuggex वास्तव में मेरे लिए काम नहीं करता है: फोंट जावास्क्रिप्ट द्वारा लागू किया जाता है, जाहिरा तौर पर, और काम करने में विफल रहता है (मेरे पास मोनोपोज़्ड फोंट हैं, फ़ायरफ़ॉक्स कंसोल उन्हें पूरी तरह से उपयोग करता है)। परिणामस्वरूप प्रदर्शन बेकार है। इसके अलावा, जावास्क्रिप्ट परीक्षण ब्राउज़र को बहुत सारे परीक्षण मामलों के साथ लटकाता है, हर संस्करण के लिए (न केवल एक बार जब निकाल दिया जाता है)। अंत में, प्रस्तावित रेगेक्स में से कुछ को खराब कर दिया जाता है और इरादा के अनुसार मेल नहीं खाता है।
7heo.tk

28

जब मैं एक रेगीक्स पर फंस जाता हूं तो मैं आमतौर पर इस पर मुड़ जाता हूं: https://regexr.com/

इसके परीक्षण के लिए एकदम सही है जहाँ कुछ गलत हो रहा है।


1
यह टूल वास्तव में उपयोगी है: यह वेब होस्ट है इसलिए कोई इंस्टॉल नहीं है, यह वास्तविक समय है इसलिए डिबगिंग एक सपना है, और इसमें उपयोगी टूलटिप्स और विशेष वर्णों की एक सूची भी है, यदि आप कुछ याद नहीं करते हैं। यह एकदम सही है, बहुत बहुत धन्यवाद
जेसन रिज

दुर्भाग्य से, यह टूल (अभी भी) आपको रेगेक्स डेलिमिटर (यहां तक ​​कि पीसीआरई इंजन के लिए) को बदलने की अनुमति नहीं देता है - वे /(स्लैश) के रूप में तय किए गए हैं । यह मेरे लिए शो स्टॉपर है।
MrWhite

19

मैं कोडोस - पायथन रेगुलर एक्सप्रेशन डीबगर का उपयोग करता हूं :

कोडोस पायथन प्रोग्रामिंग भाषा के लिए नियमित अभिव्यक्ति बनाने, परीक्षण और डिबगिंग के लिए पायथन जीयूआई उपयोगिता है। कोडोस को किसी भी डेवलपर को कुशलतापूर्वक और आसानी से पायथन में नियमित अभिव्यक्ति विकसित करने में सहायता करनी चाहिए। चूंकि पायथन के नियमित भावों का कार्यान्वयन पीसीआरई मानक पर आधारित है , कोडोस को अन्य प्रोग्रामिंग भाषाओं में डेवलपर्स को लाभान्वित करना चाहिए जो पीसीआरई मानक (पर्ल, पीएचपी, आदि ...) का भी पालन करते हैं।

(...)

वैकल्पिक शब्द

लिनक्स, यूनिक्स, विंडोज, मैक पर चलता है।


2
कोडोस सही डिबगिंग सुविधाएँ प्रदान नहीं करता है। आप रेगेक्स को आगे नहीं बढ़ा सकते और न ही निष्पादन को रोक सकते हैं।
कैंडीड डे

यह मैक पर काम करने के लिए कोई सुझाव? Sourceforge साइट मैक के लिए इंस्टॉल करने पर कोई भी जानकारी नहीं देती है, और मेरा Google-फू मुझे विफल लगता है।
एडम पार्किं

हालांकि यह Python2 प्रतीत होगा, और 2006 से (लेखन के समय 14 साल पहले) अपडेट नहीं किया गया है?
MrWhite

13

मुझे लगता है कि वे नहीं करते हैं। यदि आपका regexp बहुत जटिल है, और उस बिंदु के लिए समस्याग्रस्त है जिसे आपको डीबगर की आवश्यकता है, तो आपको एक विशिष्ट पार्सर बनाना चाहिए, या किसी अन्य विधि का उपयोग करना चाहिए। यह बहुत अधिक पठनीय और रखरखाव योग्य होगा।


4
यार, तुम regexbuddy स्क्रीन शॉट को देखने के बाद यह पोस्ट?
बदमाश

2
हर कोई इससे सहमत नहीं होगा, लेकिन यह एक बुरा विचार नहीं है। हर कोई मानता है कि रेगेक्स इंजन विशाल रेक्सक्स के साथ सबसे अधिक कुशल है। यह जरूरी सच नहीं है, और वे निश्चित रूप से पढ़ने में आसान नहीं हैं। अपने रेग्जेस को तोड़ दें।
दान रोसेनस्टार्क

1
@ मिचेल ब्रूक्स: नहीं, पहले, वास्तव में। स्क्रीनशॉट को देखने के बाद, मैं इस तथ्य के साथ ठीक हूं कि आप regexp को डिबग कर सकते हैं। लेकिन मैं अपने विचार पर खड़ा हूं: जब एक regexp बहुत जटिल हो जाता है, तो इसे दूसरे तरीके से बदलने का समय है।
वैलेंटाइन रोचर

12

एक उत्कृष्ट मुफ्त उपकरण है, रेगेक्स कोच । नवीनतम संस्करण केवल विंडोज के लिए उपलब्ध है; इसके लेखक डॉ। एडमंड वेइट्ज़ ने लिनक्स संस्करण को बनाए रखना बंद कर दिया क्योंकि बहुत कम लोगों ने इसे डाउनलोड किया था, लेकिन डाउनलोड पृष्ठ पर लिनक्स के लिए एक पुराना संस्करण है।


8

मैंने अभी-अभी Rexxp की एक प्रस्तुति देखी है :: इसके निर्माता द्वारा डेबगर: डेमियन कॉनवे। बहुत ही प्रभावशाली सामान: इनहेलर चलाएं या कमांड लाइन टूल (आरएक्सआरएक्स) का उपयोग करते हुए, अंतःक्रियात्मक रूप से या "लॉग" निष्पादन फ़ाइल (जेएसएन में संग्रहीत) पर, किसी भी बिंदु पर आगे और पीछे, ब्रेकपॉइंट या घटनाओं पर रोकें, रंगीन आउटपुट (उपयोगकर्ता कॉन्फ़िगर करने योग्य) ), अनुकूलन के लिए regexp और स्ट्रिंग पर गर्मी के नक्शे, आदि ...

सीपीएएन पर मुफ्त में उपलब्ध: http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm


ओपी ने कहा "मैं एक डिबगर के साथ एक नियमित अभिव्यक्ति नहीं कर सकता।"
क्वांटम

क्या आपके पास प्रस्तुति का लिंक है?
बदमाश

3
@ देखें, आप youtube.com/watch?v=zcSFIUiMgAs
Starfish


6

मैं अपनी आँखों से अपने रेगेक्स को डिबग करता हूं। इसलिए मैं /xसंशोधक का उपयोग करता हूं , उनके लिए टिप्पणियां लिखता हूं और उन्हें भागों में विभाजित करता हूं। कैसे तेजी से और पठनीय नियमित अभिव्यक्ति विकसित करने के लिए सीखने के लिए जेफरी फ्राइडल की मास्टेरिंग रेगुलर एक्सप्रेशंस पढ़ें । विभिन्न रेगेक्स डिबगिंग टूल सिर्फ वूडू प्रोग्रामिंग को उकसाते हैं।


5

मेरे लिए जैसा कि मैं आमतौर पर pcretest उपयोगिता का उपयोग करता हूं जो किसी भी regex के बाइट कोड को डंप कर सकता है, और आमतौर पर इसे पढ़ना अधिक आसान होता है (मेरे लिए कम से कम)। उदाहरण:

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


3

अगर मुझे अटका हुआ महसूस होता है, तो मैं txt2re का उपयोग करके एक नमूना पाठ से सीधे पिछड़े जाना और रेगेक्स को उत्पन्न करना पसंद करता हूं (हालांकि मैं आमतौर पर हाथ से परिणामी रेक्स को ट्विक करना समाप्त करता हूं)।


3

यदि आप एक मैक उपयोगकर्ता हैं, तो मैं अभी इस पर आया हूं:

http://atastypixel.com/blog/reginald-regex-explorer/

यह मुफ़्त है, और उपयोग करने के लिए सरल है, और यह सामान्य रूप से RegExs के साथ पकड़ पाने के लिए मेरे लिए एक बड़ी मदद है।



2

पीसीआरएस की तरह एक संकेतन का उपयोग करते हुए लेखन एक्सईज, कोडांतरक लिखने जैसा है: यह ठीक है यदि आप अपने सिर में संबंधित परिमित राज्य ऑटोमेटा देख सकते हैं, लेकिन यह बहुत जल्दी बनाए रखना मुश्किल हो सकता है।

डिबगर का उपयोग नहीं करने के लिए कारण बहुत कुछ एक प्रोग्रामिंग भाषा के साथ डिबगर का उपयोग न करने के लिए समान हैं: आप स्थानीय गलतियों को ठीक कर सकते हैं, लेकिन वे आपको उन डिज़ाइन समस्याओं को हल करने में मदद नहीं करेंगे जिनके कारण आप पहली बार में स्थानीय गलतियाँ कर सकते हैं। जगह।

अधिक चिंतनशील तरीका यह है कि आप अपनी प्रोग्रामिंग लैंग्वेज में रीजैक्स उत्पन्न करने के लिए डेटा अभ्यावेदन का उपयोग करें, और उन्हें बनाने के लिए उपयुक्त सार। ओलिन शाइवर ने अपनी योजना regexp संकेतन के साथ इन डेटा अभ्यावेदन को डिजाइन करने में आने वाले मुद्दों का एक उत्कृष्ट अवलोकन दिया।


पार्सर कॉम्बीनेटर वास्तव में जाने के लिए एक बढ़िया तरीका है: हास्केल में पार्सेक और पीरो, रूबी में rsec, C ++ में बूस्ट स्पिरिट, पायथन में पाइपरसिंग, पर्ल्ल 6 :: पर्ल में नियम :: आदि
पर्व

2

मैं अक्सर pcretest का उपयोग करता हूं - शायद ही एक "डिबगर" लेकिन यह केवल एक पाठ पर काम करता है SSH कनेक्शन और पार्स करता है बिल्कुल मुझे चाहिए कि रेग्क्स बोली: libpcre के लिए मेरे (C ++) कोड लिंक हैं, इसलिए जादू और क्या में सूक्ष्म अंतर के लिए कोई कठिनाई नहीं है नहीं है, आदि।

सामान्य तौर पर मैं ऊपर के उस व्यक्ति से सहमत हूं जिसके लिए एक रेगीक्स डीबगर की आवश्यकता है जो कोड गंध है। मेरे लिए regexes का उपयोग करने के बारे में सबसे कठिन आमतौर पर regex ही नहीं है, लेकिन उन्हें काम करने के लिए आवश्यक उद्धरण की कई परतों को।





0

मेरे लिए, रेगेक्स (जैसा कि मैं काफी धाराप्रवाह हूँ, और लगभग हमेशा / एक्स या समकक्ष का उपयोग कर रहा हूं) को नेत्रगोलक करने के बाद, मैं परीक्षण के बजाय डिबग कर सकता हूं अगर मैं अनिश्चित हूं तो मैं कुछ पतित मिलान (यानी कुछ ऐसा जो अत्यधिक बैकट्रैक से टकराएगा) यह देखने के लिए कि क्या मैं उदाहरण के लिए किसी ऑपरेटर की लालचीता को संशोधित करके ऐसे मुद्दों को हल कर सकता हूं।

ऐसा करने के लिए, मैं ऊपर बताए गए तरीकों में से एक का उपयोग करूंगा: pcretest, RegexBuddy (यदि मेरे वर्तमान कार्यस्थल ने इसे लाइसेंस दिया है) या इसी तरह, और कभी-कभी मैं इसे Linqpad में समय देता हूं अगर मैं C # regexes में काम कर रहा हूं।

(पर्ल ट्रिक मेरे लिए एक नया है, इसलिए संभवत: मेरे रेगेक्स टूलकिट में भी इसे शामिल किया जाएगा।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.