정규 표현식은 상당히 복잡해질 수 있습니다. 공백이 없으면 읽기가 어렵습니다. 디버거를 사용하여 정규 표현식을 밟을 수는 없습니다. 그렇다면 전문가들은 복잡한 정규식을 어떻게 디버깅합니까?
RegEx.Replace(...)
'즉시 창'으로 전환하고 몇 가지 'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)
명령을 사용하여 문제를 신속하게 제로화)
정규 표현식은 상당히 복잡해질 수 있습니다. 공백이 없으면 읽기가 어렵습니다. 디버거를 사용하여 정규 표현식을 밟을 수는 없습니다. 그렇다면 전문가들은 복잡한 정규식을 어떻게 디버깅합니까?
RegEx.Replace(...)
'즉시 창'으로 전환하고 몇 가지 'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)
명령을 사용하여 문제를 신속하게 제로화)
답변:
RegexBuddy를 구매 하고 내장 된 디버그 기능을 사용 합니다 . 1 년에 두 번 이상 정규식으로 작업하면 시간을 절약 할 수 있습니다. RegexBuddy는 단순하고 복잡한 정규 표현식을 작성하고 다양한 언어로 코드를 생성 할 수 있도록 도와줍니다.
또한 개발자에 따르면이 도구는 WINE과 함께 사용할 때 Linux에서 거의 완벽하게 실행됩니다 .
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", ...);
잊어 버리지 않도록 다른 것을 추가하겠습니다 : debuggex
매우 시각적이기 때문에 좋습니다.
정규식에 갇 히면 일반적으로 https://regexr.com/
문제가있는 곳을 빠르게 테스트하기에 적합합니다.
/
슬래시 로 고정됩니다 . 이것은 나를위한 showtopper입니다.
나는 Kodos -The Python Regular Expression Debugger를 사용합니다.
Kodos는 Python 프로그래밍 언어에 대한 정규식을 작성, 테스트 및 디버깅하기위한 Python GUI 유틸리티입니다. Kodos는 개발자가 파이썬에서 정규 표현식을 효율적이고 쉽게 개발할 수 있도록 도와야합니다. Python의 정규 표현식 구현은 PCRE 표준을 기반으로하기 때문에 Kodos는 PCRE 표준 (Perl, PHP 등)을 준수하는 다른 프로그래밍 언어의 개발자에게 이점을 제공해야합니다.
(...)
Linux, Unix, Windows, Mac에서 실행됩니다.
나는 그렇지 않다고 생각합니다. 정규식이 너무 복잡하고 디버거가 필요한 시점에서 문제가되는 경우 특정 구문 분석기를 작성하거나 다른 방법을 사용해야합니다. 훨씬 더 읽기 쉽고 유지 보수가 쉬울 것입니다.
훌륭한 무료 도구 인 Regex Coach가 있습니다. 최신 버전은 Windows에서만 사용할 수 있습니다. 저자 Edmund Weitz 박사는 Linux 버전을 다운로드하는 사람이 너무 적기 때문에 Linux 버전 유지 관리를 중단했지만 다운로드 페이지에 Linux의 이전 버전이 있습니다.
방금 작성자 인 Damian Conway의 Regexp :: Debugger 프레젠테이션을 보았습니다. 매우 인상적인 작업 : 대화식으로 또는 "로그 된"실행 파일 (JSON에 저장 됨)에서 내부 또는 명령 행 도구 (rxrx)를 사용하여 실행, 어느 시점에서든 앞뒤로 이동, 중단 점 또는 이벤트 중지, 색상 출력 (사용자 구성 가능) ), 정규 표현식의 열 맵 및 최적화를위한 문자열 등
CPAN에서 무료로 사용 가능 : http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm
나는 내 눈으로 정규식을 디버깅합니다. 그래서 /x
수정자를 사용 하고 주석을 작성하고 부분으로 나눕니다. 빠르고 읽기 쉬운 정규식을 개발하는 방법을 배우려면 Jeffrey Friedl의 Mastering Regular Expressions 를 읽으십시오 . 다양한 정규식 디버깅 도구는 부두 프로그래밍을 유발합니다.
나에 관해서는 보통 정규 표현식의 바이트 코드를 덤프 할 수있는 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
------------------------------------------------------------------
당신이 Mac 사용자라면, 나는 이것을 본 적이 있습니다.
http://atastypixel.com/blog/reginald-regex-explorer/
무료이며 사용하기 쉬우 며 일반적으로 RegEx를 이해하는 데 큰 도움이되었습니다.
regular-expressions.info 의 (무료가 아닌) 도구를 살펴보십시오 . 특히 RegexBuddy . 이 주제에 관한 Jeff Atwood의 게시물입니다 .
PCRE와 같은 표기법을 사용하여 정규 표현식을 작성하는 것은 어셈블러를 작성하는 것과 같습니다. 머릿속에 해당 유한 상태 오토마타를 볼 수 있으면 좋지만 매우 빠르게 유지 관리하기가 어려울 수 있습니다.
디버거를 사용하지 않는 이유는 프로그래밍 언어로 디버거를 사용하지 않는 이유와 거의 같습니다. 로컬 실수를 해결할 수는 있지만 처음부터 로컬 실수를하게 한 디자인 문제를 해결하는 데 도움이되지는 않습니다. 장소.
보다 반사적 인 방법은 데이터 표현을 사용하여 프로그래밍 언어로 정규 표현식을 생성하고 적절한 추상화를 작성하여 작성하는 것입니다. Olin Shiver의 계획 정규 표현식 소개 는 이러한 데이터 표현을 설계 할 때 직면 한 문제에 대한 훌륭한 개요를 제공합니다.
ActiveState Komodo에 포함 된 Rx 툴킷을 사용합니다 .
당신은 이것을 시도 할 수 있습니다 http://www.pagecolumn.com/tool/regtest.htm
나를 위해, 정규식을 눈여겨 본 후에 (나는 상당히 유창하고 거의 항상 / x 또는 동등한 것을 사용하기 때문에) 약간의 퇴화 일치 (예 : 과도하게 역행하는 것)가 있는지 확실하지 않으면 테스트 대신 디버그 할 수 있습니다 예를 들어 연산자의 욕심을 수정하여 이러한 문제를 해결할 수 있는지 확인하십시오.
이를 위해 위에서 언급 한 방법 중 하나를 사용합니다 : pcretest, RegexBuddy (현재 직장에서 라이센스가 부여 된 경우) 또는 유사하며 때로는 C # regexes에서 작업하는 경우 Linqpad에서 시간을 정합니다.
(펄 트릭은 저에게 새로운 트릭이므로 내 정규식 툴킷에도 추가 할 것입니다.)