정규식을 어떻게 디버깅합니까? [닫은]


149

정규 표현식은 상당히 복잡해질 수 있습니다. 공백이 없으면 읽기가 어렵습니다. 디버거를 사용하여 정규 표현식을 밟을 수는 없습니다. 그렇다면 전문가들은 복잡한 정규식을 어떻게 디버깅합니까?


2
정규식 "테스트"는 "디버깅"보다 훨씬 중요하다고 생각합니다. 일반적으로 정규식을 사용하여 결과를 매우 쉽게보고 (또는 답변에서 제안한 도구 중 하나를 사용하여) 진행 상황을 파악할 수 있지만 가능한 모든 경계 사례로 정규식을 테스트해야한다는 것을 실제로 확신합니다. 테스팅은 결국 실제로하고 싶은 일을 명확하게하고 디버깅을 쓸모 없게 만든다 :)
baol

7
이것은 흥미로운 보인다 http://www.debuggex.com/ (질문은 내가 진짜 대답을 추가 할 수 없습니다 닫혀 있기 때문에.)
KajMagnus

Visual Studio를 사용하는 경우 문제 영역 근처에 중단 점을 설정할 수 있습니다 (예 : RegEx.Replace(...)'즉시 창'으로 전환하고 몇 가지 'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)명령을 사용하여 문제를 신속하게 제로화)
DeepSpace101

2
실제 디버거가 있고 웹 호스팅되는 regex101.com 을 언급 한 사람이 아무도 없습니다 .
mechalynx

1
2017 년에도 regexbuddy가 여전히 내가 찾을 수있는 최고의 도구라고 생각하며 가격은 40 달러입니다. 나는 종종 다른 정규식 풍미로 다른 언어로 일하기 때문에 종종 혼란스러워합니다. regexbuddy, 그것은 단지 구문에서 저를 자유롭게
code4j

답변:


68

RegexBuddy를 구매 하고 내장 된 디버그 기능을 사용 합니다 . 1 년에 두 번 이상 정규식으로 작업하면 시간을 절약 할 수 있습니다. RegexBuddy는 단순하고 복잡한 정규 표현식을 작성하고 다양한 언어로 코드를 생성 할 수 있도록 도와줍니다.

대체 텍스트

또한 개발자에 따르면이 도구는 WINE과 함께 사용할 때 Linux에서 거의 완벽하게 실행됩니다 .


31
Windows 전용이며 40 달러입니다.
kennytm

25
개발자에 따르면 WINE을 통해 Linux에서 실행됩니다 ( regexbuddy.com/wine.html) . 그리고 약 40 달러의 비용 ... 당신의 시간은 얼마입니까?
Mick

18
이것은 무료 소프트웨어가 아닙니다.
codeholic

38
누가 말했거나 요청 했습니까?
Tim Pietzcker

21
음, Mick이 말했듯이 시간이 얼마나 가치가 있습니까? "돈을 살 수있는 최고의 도구"는 항상 돈이 들지 않아도되지만 때로는 그렇습니다. 또한, JGSoft 지속적으로 개발 위대한 뛰어난 사용자 서비스와 품질의 제품을. 나는 그것들을 지원하고 사업을 계속하기를 원하기 때문에 RegexMagic과 같이 실제로 필요하지 않은 소프트웨어를 구입했습니다. 당신은 당신이 잃어버린 것을 모른다. 진심으로.
Tim Pietzcker

52

Perl 5.10에서 use re 'debug';. (또는 debugcolor스택 오버플로에서 출력 형식을 올바르게 지정할 수 없습니다.)

$ perl -Mre = debug -e ' "foobar"= ~ / (.) \ 1 /'
REx "(.) \ 1"컴파일 중
최종 프로그램 :
   1 : OPEN1 (3)
   3 : REG_ANY (4)
   4 : CLOSE1 (6)
   6 : REF1 (8)
   8 : 끝 (0)
민렌 1
"foobar"와 REx "(.) \ 1"일치
   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"

또한, 당신은 할 수 그들을 더 읽을 수 있도록 정규 표현식에에 공백과 주석을 추가 할 수 있습니다. 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
정규식 친구가 더 좋다고 생각하지만이 방법이 마음에 듭니다.
루크

에코 "foobar"| egrep "(.) \ 1"
DmitrySandalov

30

잊어 버리지 않도록 다른 것을 추가하겠습니다 : debuggex

매우 시각적이기 때문에 좋습니다. Debuggex 정규식 헬퍼의 사진


debuggex는 실제로 나를 위해 작동하지 않습니다 : 글꼴은 JavaScript에 의해 시행되고 분명히 작동하지 않습니다 (단일 글꼴이 있으므로 Firefox 콘솔이 완벽하게 사용합니다). 결과적으로 디스플레이를 사용할 수 없습니다. 또한 JavaScript 테스트는 모든 버전에 대해 많은 테스트 사례가 포함 된 브라우저를 중단합니다 (시작할 때 한 번만). 마지막으로 제안 된 정규식 중 일부가 버그를 일으켜 의도 한대로 일치하지 않습니다.
7heo.tk

28

정규식에 갇 히면 일반적으로 https://regexr.com/

문제가있는 곳을 빠르게 테스트하기에 적합합니다.


1
이 도구는 정말 유용합니다. 웹에서 호스팅되므로 설치가 필요없고, 실시간이므로 디버깅이 꿈이며, 무언가를 기억할 수없는 경우 유용한 도구 설명과 특수 문자 목록이 있습니다. 그것은 감사 작정, 완벽
제이슨 리지

불행히도,이 도구 (여전히)를 사용하면 정규식 구분 기호 (PCRE 엔진의 경우에도)를 변경할 수 없습니다- /슬래시 로 고정됩니다 . 이것은 나를위한 showtopper입니다.
MrWhite

19

나는 Kodos -The Python Regular Expression Debugger를 사용합니다.

Kodos는 Python 프로그래밍 언어에 대한 정규식을 작성, 테스트 및 디버깅하기위한 Python GUI 유틸리티입니다. Kodos는 개발자가 파이썬에서 정규 표현식을 효율적이고 쉽게 개발할 수 있도록 도와야합니다. Python의 정규 표현식 구현은 PCRE 표준을 기반으로하기 때문에 Kodos는 PCRE 표준 (Perl, PHP 등)을 준수하는 다른 프로그래밍 언어의 개발자에게 이점을 제공해야합니다.

(...)

대체 텍스트

Linux, Unix, Windows, Mac에서 실행됩니다.


2
Kodos는 진정한 디버깅 기능을 제공하지 않습니다. 정규식을 단계적으로 수행하거나 실행을 일시 중지 할 수 없습니다.
candide

Mac에서 작동하게하는 데 도움이되는 팁이 있습니까? Sourceforge 사이트는 Mac 설치에 대한 정보를 제공하지 않으며 Google fu가 실패한 것 같습니다.
Adam Parkin

이것이 Python2 인 것처럼 보이지만 2006 년 이후 (14 년 전 글을 쓰는 시점) 업데이트되지 않았습니까?
MrWhite

13

나는 그렇지 않다고 생각합니다. 정규식이 너무 복잡하고 디버거가 필요한 시점에서 문제가되는 경우 특정 구문 분석기를 작성하거나 다른 방법을 사용해야합니다. 훨씬 더 읽기 쉽고 유지 보수가 쉬울 것입니다.


4
친구, 당신은 regexbuddy 스크린 샷을 본 후에 이것을 게시 했습니까?
rook

2
모든 사람이 이에 동의하지는 않지만 나쁜 생각은 아닙니다. 누구나 정규식 엔진이 거대한 정규식에 가장 효율적이라고 가정합니다. 반드시 그런 것은 아니며 읽기가 쉽지 않습니다. 정규식을 끊으십시오.
Dan Rosenstark

1
@ 마이클 브룩스 : 아니, 실제로. 스크린 샷을 본 후에 정규 표현식을 디버그 할 수 있다는 사실에 동의합니다. 그러나 나는 내 생각에 서있다 : 정규 표현식이 너무 복잡해지면 다른 방법으로 바꿀 시간이다.
Valentin Rocher

12

훌륭한 무료 도구 인 Regex Coach가 있습니다. 최신 버전은 Windows에서만 사용할 수 있습니다. 저자 Edmund Weitz 박사는 Linux 버전을 다운로드하는 사람이 너무 적기 때문에 Linux 버전 유지 관리를 중단했지만 다운로드 페이지에 Linux의 이전 버전이 있습니다.


8

방금 작성자 인 Damian Conway의 Regexp :: Debugger 프레젠테이션을 보았습니다. 매우 인상적인 작업 : 대화식으로 또는 "로그 된"실행 파일 (JSON에 저장 됨)에서 내부 또는 명령 행 도구 (rxrx)를 사용하여 실행, 어느 시점에서든 앞뒤로 이동, 중단 점 또는 이벤트 중지, 색상 출력 (사용자 구성 가능) ), 정규 표현식의 열 맵 및 최적화를위한 문자열 등

CPAN에서 무료로 사용 가능 : http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm


OP는 "디버거를 사용하여 정규식을 밟을 수는 없다"고 말했다.
퀀텀

프리젠 테이션에 대한 링크가 있습니까?
rook



6

나는 내 눈으로 정규식을 디버깅합니다. 그래서 /x수정자를 사용 하고 주석을 작성하고 부분으로 나눕니다. 빠르고 읽기 쉬운 정규식을 개발하는 방법을 배우려면 Jeffrey Friedl의 Mastering Regular Expressions 를 읽으십시오 . 다양한 정규식 디버깅 도구는 부두 프로그래밍을 유발합니다.


5

나에 관해서는 보통 정규 표현식의 바이트 코드를 덤프 할 수있는 pcretest 유틸리티를 사용하며 일반적으로 읽기가 훨씬 쉽습니다 (적어도 나를 위해). 예:

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를 사용하여 샘플 텍스트에서 직접 정규식을 생성하고 싶습니다 (일반적으로 결과 정규식을 수동으로 조정하지만 결국).




2

PCRE와 같은 표기법을 사용하여 정규 표현식을 작성하는 것은 어셈블러를 작성하는 것과 같습니다. 머릿속에 해당 유한 상태 오토마타를 볼 수 있으면 좋지만 매우 빠르게 유지 관리하기가 어려울 수 있습니다.

디버거를 사용하지 않는 이유는 프로그래밍 언어로 디버거를 사용하지 않는 이유와 거의 같습니다. 로컬 실수를 해결할 수는 있지만 처음부터 로컬 실수를하게 한 디자인 문제를 해결하는 데 도움이되지는 않습니다. 장소.

보다 반사적 인 방법은 데이터 표현을 사용하여 프로그래밍 언어로 정규 표현식을 생성하고 적절한 추상화를 작성하여 작성하는 것입니다. Olin Shiver의 계획 정규 표현식 소개 는 이러한 데이터 표현을 설계 할 때 직면 한 문제에 대한 훌륭한 개요를 제공합니다.


파서 콤비 네이터는 참으로 멋진 길입니다 : Haskell의 Parsec과 PAr, 루비의 rsec, C ++의 Boost Spirit, Python의 PyParsing, Perl6 :: Rules의 Perl 등
ephemient

2

나는 종종 pcretest를 사용한다-거의 "디버거"는 아니지만 텍스트 전용 SSH 연결을 통해 작동하고 필요한 정규식 방언을 정확하게 구문 분석한다 : 내 (C ++) 코드는 libpcre에 링크되어 있으므로, 마술과 내용의 미묘한 차이에 어려움이 없다 등이 아닙니다.

일반적으로 정규식 디버거가 필요한 위의 사람이 코드 냄새입니다. 저에게 정규 표현식 사용에 대한 가장 어려운 점은 일반적으로 정규 표현식 자체가 아니지만 여러 계층의 인용문이 작동하는 데 필요했습니다.





0

나를 위해, 정규식을 눈여겨 본 후에 (나는 상당히 유창하고 거의 항상 / x 또는 동등한 것을 사용하기 때문에) 약간의 퇴화 일치 (예 : 과도하게 역행하는 것)가 있는지 확실하지 않으면 테스트 대신 디버그 할 수 있습니다 예를 들어 연산자의 욕심을 수정하여 이러한 문제를 해결할 수 있는지 확인하십시오.

이를 위해 위에서 언급 한 방법 중 하나를 사용합니다 : pcretest, RegexBuddy (현재 직장에서 라이센스가 부여 된 경우) 또는 유사하며 때로는 C # regexes에서 작업하는 경우 Linqpad에서 시간을 정합니다.

(펄 트릭은 저에게 새로운 트릭이므로 내 정규식 툴킷에도 추가 할 것입니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.