คุณจะดีบัก regex อย่างไร [ปิด]


149

นิพจน์ทั่วไปนั้นค่อนข้างซับซ้อน การขาดพื้นที่สีขาวทำให้อ่านยาก ฉันไม่สามารถก้าวผ่านนิพจน์ปกติด้วยตัวดีบัก ดังนั้นผู้เชี่ยวชาญจะดีบักนิพจน์ทั่วไปที่ซับซ้อนได้อย่างไร


2
ฉันเชื่อว่า "การทดสอบ" regex ของคุณมีความสำคัญมากกว่า "การดีบัก" โดยปกติคุณสามารถคิดได้ว่าเกิดอะไรขึ้นกับ regex อย่างง่ายดายดูผลลัพธ์ (หรือใช้หนึ่งในเครื่องมือที่แนะนำในคำตอบ) แต่เพื่อให้แน่ใจว่าจริง ๆ แล้วมันเป็นสิ่งที่คุณหมายความว่าคุณควรทดสอบ regex ของคุณกับกรณีชายแดนที่เป็นไปได้ทั้งหมด การทดสอบในที่สุดจะชี้แจงสิ่งที่คุณต้องการจะทำและทำให้การแก้จุดบกพร่องไร้ประโยชน์ :) ใน
ตอนนี้

7
สิ่งนี้น่าสนใจ: http://www.debuggex.com/ (เนื่องจากคำถามถูกปิดฉันไม่สามารถเพิ่มคำตอบที่แท้จริงได้)
KajMagnus

หากคุณมี Visual Studio คุณสามารถตั้งค่าเบรกพอยต์ใกล้กับพื้นที่ปัญหาของคุณ (เช่น: RegEx.Replace(...)เปลี่ยนเป็น 'หน้าต่างทันที' และลองใช้'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)คำสั่งสองสามคำเพื่อให้เป็นศูนย์ในปัญหาได้อย่างรวดเร็ว
DeepSpace101

2
ฉันประหลาดใจมากที่ไม่มีใครพูดถึงregex101.comซึ่งมีดีบักเกอร์จริงและโฮสต์บนเว็บด้วย
mechalynx

1
แม้ในปี 2560 ฉันเชื่อว่า regexbuddy ยังคงเป็นเครื่องมือที่ดีที่สุดที่ฉันสามารถหาได้และราคายังคงอยู่ที่ $ 40 ฉันมักจะทำงานในภาษาต่าง ๆ ที่มีรสชาติที่แตกต่างกันดังนั้นฉันมักจะสับสน ด้วย regexbuddy มันทำให้ฉันเป็นอิสระจากไวยากรณ์
code4j

คำตอบ:


68

คุณซื้อRegexBuddyและใช้คุณสมบัติการดีบักในตัว หากคุณทำงานกับ regexes มากกว่าสองครั้งต่อปีคุณจะสามารถประหยัดเงินได้ทันเวลา RegexBuddy จะช่วยคุณในการสร้างนิพจน์ทั่วไปที่เรียบง่ายและซับซ้อนและยังสร้างรหัสให้คุณในหลายภาษา

ข้อความแสดงแทน

นอกจากนี้ตามที่นักพัฒนาเครื่องมือนี้ทำงานเกือบไม่มีที่ติบนลินุกซ์เมื่อใช้กับไวน์


31
น่าเสียดายที่มันเป็น Windows เท่านั้นและมีค่าใช้จ่าย US $ 40
kennytm

25
มันทำงานบนลินุกซ์ผ่านไวน์ตามที่นักพัฒนา: regexbuddy.com/wine.html และค่าใช้จ่ายประมาณ $ 40 ... เวลาของคุณมีค่าเท่าไหร่?
มิก

18
นี่ไม่ใช่ซอฟต์แวร์ฟรี
codeholic

38
ใครบอกว่าเป็นหรือถาม
Tim Pietzcker

21
อย่างที่มิคพูดว่าเวลาของคุณมีค่าเท่าไหร่? "เงินเครื่องมือที่ดีที่สุดสามารถซื้อได้" ไม่จำเป็นต้องเสียเงินเสมอไป แต่บางครั้งพวกเขาก็ทำได้ นอกจากนี้ JGSoft พัฒนาผลิตภัณฑ์ที่มีคุณภาพยอดเยี่ยมอย่างต่อเนื่องพร้อมบริการผู้ใช้ที่ยอดเยี่ยม ฉันได้ซื้อซอฟต์แวร์จากพวกเขาฉันไม่ต้องการ (เช่น RegexMagic) เพราะฉันต้องการสนับสนุนพวกเขาและทำให้พวกเขาอยู่ในธุรกิจ คุณไม่รู้ว่าคุณขาดอะไร อย่างจริงจัง.
Tim Pietzcker

52

ด้วย Perl use re 'debug';5.10, (หรือdebugcolorแต่ฉันไม่สามารถฟอร์แมตเอาต์พุตอย่างถูกต้องใน Stack Overflow)

$ perl -Mre = debug -e '"foobar" = ~ / (.) \ 1 /'
การคอมไพล์ REx "(.) \ 1"
โปรแกรมสุดท้าย:
   1: OPEN1 (3)
   3: REG_ANY (4)
   4: ปิด 1 (6)
   6: REF1 (8)
   8: END (0)
minlen 1
การจับคู่ REx "(.) \ 1" กับ "foobar"
   0 <> <foobar> | 1: OPEN1 (3)
   0 <> <foobar> | 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> <bar> | 8: END (0)
ประสบความสำเร็จในการแข่งขัน!
การเลิก REx: "(.) \ 1"

นอกจากนี้คุณสามารถเพิ่มช่องว่างและความคิดเห็นลงใน regexes เพื่อให้อ่านง่ายขึ้น ใน Perl สิ่งนี้ทำได้ด้วยโมดิ/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: ทำไมทุกคนถึงชอบ Regexbuddy
Charles Stewart

1
ฉันชอบวิธีนี้แม้ว่าฉันคิดว่าเพื่อน regex ดีกว่า
rook

echo "foobar" | egrep "(.) \ 1"
DmitrySandalov

30

ฉันจะเพิ่มอีกเพื่อที่ฉันจะไม่ลืมมัน: debuggex

เป็นเรื่องที่ดีเพราะมันเห็นได้ชัดมาก: ภาพถ่ายของผู้ช่วย debuggex regex


debuggex ใช้งานไม่ได้สำหรับฉัน: แบบอักษรมีการบังคับใช้โดย JavaScript, เห็นได้ชัดและล้มเหลวในการทำงาน (ฉันมีแบบอักษรแบบโมโนโพสต์คอนโซล firefox ใช้อย่างสมบูรณ์แบบ) ดังนั้นการแสดงผลจึงใช้ไม่ได้ นอกจากนี้การทดสอบ JavaScript จะหยุดเบราว์เซอร์ด้วยกรณีทดสอบจำนวนมากสำหรับทุกรุ่น (ไม่เพียงครั้งเดียวเมื่อถูกไล่ออก) ในที่สุด regexes ที่เสนอบางส่วนจะถูกบั๊กและไม่ตรงกับที่ตั้งใจไว้
7heo.tk

28

เมื่อฉันติดกับ regex ฉันมักจะหันไปนี้: https://regexr.com/

มันสมบูรณ์แบบสำหรับการทดสอบอย่างรวดเร็วซึ่งมีบางสิ่งผิดปกติ


1
เครื่องมือนี้มีประโยชน์จริง ๆ : เป็นเว็บไซต์ที่ไม่มีการติดตั้งจึงเป็นเวลาจริงดังนั้นการดีบักจึงเป็นความฝันและยังมีเคล็ดลับเครื่องมือที่มีประโยชน์และรายการอักขระพิเศษในกรณีที่คุณจำอะไรไม่ได้ มันสมบูรณ์แบบขอบคุณมาก
Jason Ridge

น่าเสียดายที่เครื่องมือนี้ (ยัง) ไม่อนุญาตให้คุณเปลี่ยนตัวคั่น regex (แม้แต่สำหรับ PCRE engine) - มันถูกกำหนดเป็น/(เครื่องหมายทับ) นี่เป็นสิ่งที่ดีสำหรับฉัน
MrWhite

19

ฉันใช้Kodos - ดีบักเกอร์ Expression Python ปกติ:

Kodos เป็นยูทิลิตี้ Python GUI สำหรับการสร้างการทดสอบและการดีบักนิพจน์ทั่วไปสำหรับภาษาการเขียนโปรแกรม Python Kodos ควรช่วยผู้พัฒนาให้มีประสิทธิภาพและง่ายดายในการพัฒนานิพจน์ทั่วไปใน Python เนื่องจากการดำเนินการของ Python ในการแสดงออกปกติขึ้นอยู่กับมาตรฐานPCRE , Kodos ควรได้รับประโยชน์นักพัฒนาในภาษาการเขียนโปรแกรมอื่น ๆ ที่เป็นไปตามมาตรฐาน PCRE (Perl, PHP, ฯลฯ ... )

( ... )

ข้อความแสดงแทน

ทำงานบน Linux, Unix, Windows, Mac


2
Kodos ไม่มีคุณสมบัติการแก้ไขข้อบกพร่องที่แท้จริง คุณไม่สามารถทำขั้นตอน regex หรือหยุดการทำงานชั่วคราว
candide

มีคำแนะนำในการใช้งานบน Mac หรือไม่? ไซต์ Sourceforge ไม่ได้ให้ข้อมูลใด ๆ เกี่ยวกับการติดตั้งสำหรับ Mac และดูเหมือนว่า Google-fu ของฉันจะทำให้ฉันล้มเหลว
Adam Parkin

ถึงแม้ว่าสิ่งนี้จะเป็น Python2 และยังไม่ได้รับการปรับปรุงตั้งแต่ปี 2549 (14 ปีที่ผ่านมาในขณะที่เขียน)?
MrWhite

13

ฉันคิดว่าพวกเขาทำไม่ได้ หาก regexp ของคุณซับซ้อนเกินไปและมีปัญหาจนถึงจุดที่คุณต้องการดีบักเกอร์คุณควรสร้างโปรแกรมแยกวิเคราะห์เฉพาะหรือใช้วิธีอื่น มันจะสามารถอ่านและบำรุงรักษาได้มากขึ้น


4
เพื่อนคุณโพสต์สิ่งนี้หลังจากดูภาพหน้าจอ regexbuddy?
rook

2
ทุกคนจะไม่เห็นด้วยกับสิ่งนี้ แต่มันไม่ใช่ความคิดที่เลว ทุกคนสันนิษฐานว่าเอ็นจิ้น regex มีประสิทธิภาพสูงสุดด้วยเรกซ์ขนาดใหญ่ สิ่งนี้ไม่เป็นความจริงและแน่นอนว่าไม่ใช่เรื่องง่ายที่จะอ่าน ทำลาย regexes ของคุณ
Dan Rosenstark

1
@Michael Brooks: ไม่จริงก่อนหน้านี้ เมื่อเห็นภาพหน้าจอฉันก็โอเคกับความจริงที่ว่าคุณสามารถ debug regexp ได้ แต่ฉันยืนบนความคิดของฉัน: เมื่อ regexp ซับซ้อนเกินไปถึงเวลาที่จะเปลี่ยนไปอีกทางหนึ่ง
Valentin Rocher

12

มีเครื่องมือฟรีที่ดีเยี่ยมเป็นRegex โค้ช เวอร์ชั่นล่าสุดใช้งานได้กับ Windows เท่านั้น ผู้เขียน Dr. Edmund Weitz หยุดการบำรุงรักษา Linux เนื่องจากมีผู้ดาวน์โหลดน้อยเกินไป แต่มี Linux รุ่นเก่าในหน้าดาวน์โหลด


8

ฉันเพิ่งเห็นการนำเสนอของ Regexp :: Debugger โดยผู้สร้าง: Damian Conway สิ่งที่น่าประทับใจมาก: รัน inplace หรือใช้เครื่องมือบรรทัดคำสั่ง (rxrx) แบบโต้ตอบหรือในไฟล์การดำเนินการ "บันทึก" (เก็บไว้ใน JSON) ก้าวไปข้างหน้าและย้อนหลัง ณ จุดใด ๆ หยุดที่จุดพักหรือเหตุการณ์เอาท์พุทสี ) แผนที่ความร้อนบน regexp และสตริงสำหรับการเพิ่มประสิทธิภาพ ฯลฯ ...

มีให้ใน CPAN ฟรี: http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm


OP กล่าวว่า "ฉันไม่สามารถก้าวผ่านนิพจน์ปกติด้วยดีบัก"
ควอนตัม

คุณมีลิงค์ไปยังงานนำเสนอหรือไม่?
rook

3
@Rook คุณสามารถดูงานนำเสนอได้ที่youtube.com/watch?v=zcSFIUiMGAs
Starfish


6

ฉันดีบัก regexes ด้วยตาของฉันเอง นั่นเป็นเหตุผลที่ฉันใช้โมดิ/xฟายเออร์เขียนความคิดเห็นสำหรับพวกเขาและแยกเป็นส่วน ๆ อ่านนิพจน์ปกติของMasteringของ Jeffrey Friedl เพื่อเรียนรู้วิธีพัฒนานิพจน์ทั่วไปที่รวดเร็วและอ่านได้ เครื่องมือการดีบัก regex หลากหลายเพียงกระตุ้นการเขียนโปรแกรมวู


5

สำหรับฉันฉันมักจะใช้ยูทิลิตี้ pcretest ซึ่งสามารถถ่ายโอนข้อมูลรหัส byte ของ 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

ถ้าฉันรู้สึกติดอยู่ฉันชอบที่จะย้อนกลับและสร้าง regex โดยตรงจากข้อความตัวอย่างโดยใช้txt2re (แม้ว่าฉันมักจะลงเอยด้วยการปรับแต่ง regex ผลลัพธ์ด้วยมือ)


3

หากคุณเป็นผู้ใช้ Mac ฉันเพิ่งเจอสิ่งนี้:

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

มันฟรีและใช้งานง่ายและมันก็เป็นความช่วยเหลือที่ดีสำหรับฉันในการจับกับ RegExs โดยทั่วไป



2

การเขียน reg โดยใช้สัญกรณ์เหมือนกับ PCREs นั้นเหมือนกับการเขียนแอสเซมเบลอร์: มันก็โอเคถ้าคุณสามารถเห็นออโต จำกัด สถานะที่สอดคล้องกันในหัวของคุณ แต่มันก็ยากที่จะรักษาอย่างรวดเร็ว

เหตุผลที่ไม่ใช้ดีบักเกอร์นั้นเหมือนกับการไม่ใช้ดีบักเกอร์กับภาษาการเขียนโปรแกรม: คุณสามารถแก้ไขข้อผิดพลาดในเครื่อง แต่พวกเขาจะไม่ช่วยคุณแก้ปัญหาการออกแบบที่ทำให้คุณทำผิดพลาดในเครื่องแรก สถานที่.

วิธีไตร่ตรองมากขึ้นคือการใช้การแสดงข้อมูลเพื่อสร้าง regexps ในภาษาการเขียนโปรแกรมของคุณและมี abstractions ที่เหมาะสมในการสร้าง การแนะนำของแลง Shiver เกี่ยวกับสัญกรณ์ regexp ของเขาให้ภาพรวมที่ยอดเยี่ยมของปัญหาที่ต้องเผชิญในการออกแบบการแสดงข้อมูลเหล่านี้


ผู้รวม Parser เป็นวิธีที่ยอดเยี่ยมที่จะไป: Parsec และ PArrows ใน Haskell, rsec ใน Ruby, Boost Spirit ใน C ++, PyParsing ใน Python, Perl6 :: กฎใน Perl ฯลฯ
ephemient

2

ฉันมักจะใช้ pcretest - แทบจะไม่ "debugger" แต่ทำงานผ่านการเชื่อมต่อ SSH แบบข้อความอย่างเดียวและแยกวิเคราะห์ภาษา regex ที่ฉันต้องการ: ลิงก์โค้ดของฉัน (C ++) ไปยัง libpcre ดังนั้นจึงไม่มีความแตกต่างเล็กน้อยในเวทมนตร์และอะไร ไม่ได้เป็นต้น

โดยทั่วไปฉันเห็นด้วยกับคนข้างต้นที่ต้องการ debugger regex เป็นกลิ่นรหัส สำหรับฉันสิ่งที่ยากที่สุดเกี่ยวกับการใช้ regexes มักไม่ใช่ regex แต่การเขียนข้อความหลาย ๆ ชั้นเพื่อให้มันทำงานได้





0

สำหรับฉันหลังจากที่ใช้สายตา regex (เนื่องจากฉันค่อนข้างคล่องแคล่วและเกือบจะใช้ / x หรือเทียบเท่าเสมอ) ฉันอาจตรวจแก้จุดบกพร่องแทนที่จะทดสอบว่าฉันไม่แน่ใจว่าจะตีคู่ที่เสื่อมสภาพหรือไม่ เพื่อดูว่าฉันสามารถแก้ไขปัญหาดังกล่าวได้หรือไม่โดยการแก้ไขความโลภของผู้ปฏิบัติงานตัวอย่างเช่น

ในการทำเช่นนั้นฉันจะใช้วิธีการใดวิธีการหนึ่งที่กล่าวถึงข้างต้น: pcretest, RegexBuddy (ถ้าที่ทำงานปัจจุบันของฉันมีลิขสิทธิ์) หรือคล้ายกันและบางครั้งฉันใช้เวลาใน Linqpad ถ้าฉันทำงานใน C # regexes

(เคล็ดลับ Perl เป็นหนึ่งใหม่สำหรับฉันดังนั้นอาจจะเพิ่มไปยังชุดเครื่องมือ regex ของฉันด้วย)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.