Làm thế nào để bạn gỡ lỗi một regex? [đóng cửa]


149

Biểu thức thông thường có thể trở nên khá phức tạp. Việc thiếu khoảng trắng khiến chúng khó đọc. Tôi không thể bước qua một biểu thức thông thường với trình gỡ lỗi. Vậy làm thế nào để các chuyên gia gỡ lỗi các biểu thức chính quy phức tạp?


2
Tôi tin rằng "kiểm tra" regex của bạn quan trọng hơn nhiều so với "gỡ lỗi" nó. Bạn thường có thể hình dung những gì đang diễn ra với regex khá dễ dàng nhìn vào kết quả (hoặc sử dụng một trong các công cụ được đề xuất trong câu trả lời), nhưng để thực sự chắc chắn rằng nó có nghĩa là bạn nên kiểm tra regex của mình với tất cả các trường hợp viền có thể. Thử nghiệm cuối cùng sẽ làm rõ những gì bạn thực sự muốn làm và làm cho việc gỡ lỗi trở nên vô dụng :)
baol

7
Điều này có vẻ thú vị: http://www.debuggex.com/ (Vì câu hỏi đã bị đóng nên tôi không thể thêm câu trả lời thực sự.)
KajMagnus

Nếu bạn có Visual Studio, bạn có thể đặt điểm dừng gần khu vực sự cố của mình (ví dụ RegEx.Replace(...):, chuyển sang 'Cửa sổ ngay lập tức' và thử một vài 'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)lệnh để nhanh chóng xử lý vấn đề.
DeepSpace101

2
Tôi rất ngạc nhiên dường như không ai đề cập đến regex101.com có trình gỡ lỗi thực tế và cũng được lưu trữ trên web.
điện tử

1
ngay cả trong năm 2017, tôi tin rằng regexbuddy vẫn là công cụ tốt nhất tôi có thể tìm thấy và giá vẫn ở mức 40 đô la. Tôi thường làm việc ở các ngôn ngữ khác nhau với hương vị regex khác nhau, vì vậy tôi thường bị nhầm lẫn. Với regexbuddy, nó chỉ giải phóng tôi khỏi cú pháp
code4j

Câu trả lời:


68

Bạn mua RegexBuddy và sử dụng tính năng gỡ lỗi tích hợp của nó . Nếu bạn làm việc với regexes hơn hai lần một năm, bạn sẽ kiếm được số tiền này trong thời gian tiết kiệm nhanh chóng. RegexBuddy cũng sẽ giúp bạn tạo các biểu thức chính quy đơn giản và phức tạp và thậm chí tạo mã cho bạn bằng nhiều ngôn ngữ.

văn bản thay thế

Ngoài ra, theo nhà phát triển, công cụ này chạy gần như hoàn hảo trên Linux khi được sử dụng với WINE .


31
Quá tệ, nó chỉ dành cho Windows và có giá US $ 40.
kennytm

25
Nó chạy trên Linux thông qua WINE, theo nhà phát triển: regexbuddy.com/wine.html . Và khoảng 40 đô la chi phí ... thời gian của bạn đáng giá bao nhiêu?
Mick

18
Đây không phải là phần mềm miễn phí.
codeholic

38
Ai nói nó đã hoặc yêu cầu nó?
Tim Pietzcker

21
Chà, như Mick đã nói, thời gian của bạn đáng giá bao nhiêu? "Những công cụ tốt nhất mà tiền có thể mua" không phải lúc nào cũng phải trả tiền, nhưng đôi khi chúng làm được. Thêm vào đó, JGSoft liên tục phát triển các sản phẩm chất lượng tuyệt vời với dịch vụ người dùng đặc biệt. Tôi thậm chí đã mua phần mềm từ họ mà tôi không thực sự cần (như RegexMagic) vì tôi muốn hỗ trợ họ và duy trì chúng trong kinh doanh. Bạn không biết bạn đang thiếu gì. Nghiêm túc.
Tim Pietzcker

52

Với Perl 5.10 , use re 'debug';. (Hoặc debugcolor, nhưng tôi không thể định dạng đầu ra chính xác trên Stack Overflow.)

$ perl -Mre = gỡ lỗi -e '"foobar" = ~ / (.) \ 1 /'
Biên dịch REx "(.) \ 1"
Chương trình cuối cùng:
   1: MỞ 1 (3)
   3: ĐĂNG KÝ (4)
   4: ĐÓNG1 (6)
   6: REF1 (8)
   8: HẾT (0)
minlen 1
Kết hợp REx "(.) \ 1" với "foobar"
   0 <> <foobar> | 1: MỞ 1 (3)
   0 <> <foobar> | 3: ĐĂNG KÝ (4)
   1 <f> <oobar> | 4: ĐÓNG1 (6)
   1 <f> <oobar> | 6: REF1 (8)
                                  thất bại...
   1 <f> <oobar> | 1: MỞ 1 (3)
   1 <f> <oobar> | 3: ĐĂNG KÝ (4)
   2 <fo> <obar> | 4: ĐÓNG1 (6)
   2 <fo> <obar> | 6: REF1 (8)
   3 <foo> <bar> | 8: HẾT (0)
Trận đấu thành công!
Giải phóng REx: "(.) \ 1"

Ngoài ra, bạn có thể thêm khoảng trắng và nhận xét vào biểu thức để làm cho chúng dễ đọc hơn. Trong Perl, điều này được thực hiện với công cụ /xsửa đổi. Với pcre, có PCRE_EXTENDEDcờ.

"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: Tại sao mọi người thích Regexbuddy hơn thế này?
Charles Stewart

1
Tôi thích phương pháp này, mặc dù tôi nghĩ bạn thân regex là tốt hơn.
rook

tiếng vang "foobar" | egrep "(.) \ 1"
DmitrySandalov

30

Tôi sẽ thêm một cái khác để tôi không quên nó: debuggex

Điều đó tốt bởi vì nó rất trực quan: Hình ảnh của người trợ giúp reguggex regex


debuggex thực sự không hoạt động đối với tôi: các phông chữ được thi hành bởi JavaScript, rõ ràng và không hoạt động (Tôi có các phông chữ đơn cách, bảng điều khiển firefox sử dụng chúng hoàn hảo). Kết quả là màn hình không sử dụng được. Ngoài ra, thử nghiệm JavaScript treo trình duyệt với rất nhiều trường hợp thử nghiệm, cho mỗi phiên bản (không chỉ một lần khi được kích hoạt). Cuối cùng, một số biểu thức chính được đề xuất bị lỗi và không khớp như dự định.
7heo.tk

28

Khi tôi gặp khó khăn trên regex, tôi thường chuyển sang đây: https://regexr.com/

Nó hoàn hảo để nhanh chóng kiểm tra nơi có sự cố.


1
Công cụ này thực sự hữu ích: nó được lưu trữ trên web nên không cần cài đặt, đó là thời gian thực để gỡ lỗi là một giấc mơ và thậm chí nó còn có các chú giải công cụ hữu ích và một danh sách các ký tự đặc biệt, trong trường hợp bạn không thể nhớ điều gì đó. Thật hoàn hảo, cảm ơn rất nhiều
Jason Ridge

Thật không may, công cụ này (vẫn) không cho phép bạn thay đổi các dấu phân cách regex (ngay cả đối với công cụ PCRE) - chúng được cố định là /(dấu gạch chéo). Đây là một showstopper cho tôi.
MrWhite

19

Tôi sử dụng Kodos - Trình gỡ lỗi biểu thức chính quy Python:

Kodos là một tiện ích GUI của Python để tạo, kiểm tra và gỡ lỗi các biểu thức thông thường cho ngôn ngữ lập trình Python. Kodos nên hỗ trợ bất kỳ nhà phát triển nào phát triển các biểu thức chính quy trong Python một cách hiệu quả và dễ dàng. Do việc triển khai các biểu thức chính quy của Python dựa trên tiêu chuẩn PCRE , Kodos nên có lợi cho các nhà phát triển trong các ngôn ngữ lập trình khác cũng tuân thủ tiêu chuẩn PCRE (Perl, PHP, v.v.).

(...)

văn bản thay thế

Chạy trên Linux, Unix, Windows, Mac.


2
Kodos không cung cấp các tính năng sửa lỗi thực sự. Bạn không thể bước regex cũng như tạm dừng thực thi.
candide

Bất kỳ lời khuyên về việc làm cho nó hoạt động trên máy Mac? Trang web Sourceforge không cung cấp bất kỳ thông tin nào về việc cài đặt cho Mac và Google-fu của tôi dường như làm tôi thất vọng.
Adam Parkin

Mặc dù đây có vẻ là Python2 và chưa được cập nhật từ năm 2006 (14 năm trước tại thời điểm viết bài)?
MrWhite

13

Tôi nghĩ rằng họ không. Nếu regrec của bạn quá phức tạp và có vấn đề đến mức bạn cần một trình gỡ lỗi, bạn nên tạo một trình phân tích cú pháp cụ thể hoặc sử dụng một phương thức khác. Nó sẽ dễ đọc hơn nhiều và có thể duy trì.


4
Anh bạn, bạn đã đăng cái này sau khi nhìn vào ảnh chụp màn hình regexbuddy?
rook

2
Mọi người sẽ không đồng ý với điều này, nhưng đó không phải là một ý tưởng tồi. Mọi người đều cho rằng công cụ regex hiệu quả nhất với các biểu thức chính quy khổng lồ. Điều này không hẳn đúng và chúng chắc chắn không dễ đọc. Phá vỡ regexes của bạn lên.
Dan Rosenstark

1
@Michael Brooks: Không, trước đây, thực sự. Nhìn thấy ảnh chụp màn hình, tôi thấy ổn với thực tế là bạn CÓ THỂ gỡ lỗi một regrec. Nhưng tôi đứng trên ý tưởng của mình: khi một biểu thức chính quy trở nên quá phức tạp, đã đến lúc thay đổi sang một cách khác.
Valentin Rocher

12

Có một công cụ miễn phí tuyệt vời, Regex Coach . Phiên bản mới nhất chỉ có sẵn cho Windows; tác giả của nó, Tiến sĩ Edmund Weitz đã ngừng duy trì phiên bản Linux vì có quá ít người tải xuống, nhưng có một phiên bản cũ hơn cho Linux trên trang tải xuống.


8

Tôi vừa xem một bài thuyết trình về Regapi :: Debugger của người tạo ra nó: Damian Conway. Nội dung rất ấn tượng: chạy tại chỗ hoặc sử dụng công cụ dòng lệnh (rxrx), tương tác hoặc trên tệp thực thi "đã ghi" (được lưu trữ trong JSON), bước tới và lùi tại bất kỳ điểm nào, dừng trên các điểm dừng hoặc sự kiện, đầu ra màu (có thể định cấu hình người dùng ), bản đồ nhiệt trên regrec và chuỗi để tối ưu hóa, v.v ...

Có sẵn trên CPAN miễn phí: http://search.cpan.org/~dconway/Regapi-Debugger/lib/Regapi/Debugger.pm


OP nói "Tôi không thể bước qua một biểu thức thông thường với trình gỡ lỗi."
lượng tử

Bạn có một liên kết đến bài thuyết trình?
rook

3
@Rook, Bạn có thể xem bản trình bày tại youtube.com/watch?v=zcSFIUiMgAs
Starfish


6

Tôi gỡ lỗi regexes của mình bằng chính mắt mình. Đó là lý do tại sao tôi sử dụng công cụ /xsửa đổi, viết bình luận cho họ và chia chúng thành nhiều phần. Đọc các biểu thức chính quy của Jeffrey Friedl để tìm hiểu cách phát triển các biểu thức chính quy nhanh và dễ đọc. Các công cụ gỡ lỗi regex khác nhau chỉ kích thích lập trình voodoo.


5

Đối với tôi, tôi thường sử dụng tiện ích pcretest có thể kết xuất mã byte của bất kỳ regex nào và thường thì nó dễ đọc hơn nhiều (đối với tôi ít nhất). Thí dụ:

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

Nếu tôi cảm thấy bế tắc, tôi muốn quay lại và tạo regex trực tiếp từ một văn bản mẫu bằng cách sử dụng txt2re (mặc dù tôi thường kết thúc việc điều chỉnh regex kết quả bằng tay).




2

Viết reg exes bằng cách sử dụng ký hiệu như PCRE cũng giống như trình biên dịch viết: thật tốt nếu bạn chỉ nhìn thấy automata trạng thái hữu hạn tương ứng trong đầu, nhưng có thể khó duy trì rất nhanh.

Lý do không sử dụng trình gỡ lỗi cũng giống như không sử dụng trình gỡ lỗi với ngôn ngữ lập trình: bạn có thể sửa các lỗi cục bộ, nhưng chúng sẽ không giúp bạn giải quyết các vấn đề thiết kế khiến bạn mắc lỗi cục bộ trong lần đầu tiên địa điểm.

Cách phản ánh hơn là sử dụng các biểu diễn dữ liệu để tạo biểu thức chính trong ngôn ngữ lập trình của bạn và có các tóm tắt thích hợp để xây dựng chúng. Giới thiệu của Olin Shiver về ký hiệu regrec lược đồ của mình cung cấp một cái nhìn tổng quan tuyệt vời về các vấn đề gặp phải khi thiết kế các biểu diễn dữ liệu này.


Combinators Parser là thực sự là một cách tuyệt vời để đi: Parsec và PArrows trong Haskell, rsec trong Ruby, Tăng Thần trong C ++, PyParsing bằng Python, Perl6 :: quy tắc trong Perl vv
ephemient

2

Tôi thường sử dụng pcretest - hầu như không phải là "trình gỡ lỗi" nhưng nó hoạt động trên kết nối SSH chỉ có văn bản và phân tích chính xác phương ngữ regex tôi cần: mã (C ++) của tôi liên kết với libpcre, vì vậy không có khó khăn gì với sự khác biệt tinh tế trong ma thuật và những gì không, v.v.

Nói chung, tôi đồng ý với người ở trên cần một trình gỡ lỗi regex là một mùi mã. Đối với tôi, khó nhất khi sử dụng regexes thường không phải là chính regex, mà là nhiều lớp trích dẫn cần thiết để làm cho chúng hoạt động.





0

Đối với tôi, sau khi đã đánh dấu regex (vì tôi khá thông thạo và gần như luôn luôn sử dụng / x hoặc tương đương), tôi có thể gỡ lỗi thay vì kiểm tra nếu tôi không chắc chắn liệu mình có đạt được kết quả khớp thoái hóa không (ví dụ như thứ gì đó quá ngược) để xem liệu tôi có thể giải quyết các vấn đề như vậy bằng cách sửa đổi sự tham lam của một nhà điều hành chẳng hạn.

Để làm điều đó, tôi sẽ sử dụng một trong các phương pháp được đề cập ở trên: pcretest, RegexBuddy (nếu nơi làm việc hiện tại của tôi đã cấp phép cho nó) hoặc tương tự, và đôi khi tôi sử dụng Linqpad nếu tôi làm việc trong các biểu thức C #.

(Thủ thuật perl là một thủ thuật mới đối với tôi, vì vậy có lẽ cũng sẽ thêm nó vào bộ công cụ regex của tôi.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.