정규식 맛을 알고
정규 표현이 본질적으로 언어에 구애받지 않는다고 생각하는 사람들은 놀랍습니다. 그러나 실제로는 풍미 사이에 상당한 차이가 있으며 특히 코드 골프의 경우 몇 가지와 흥미로운 기능을 아는 것이 좋으므로 각 작업에 가장 적합한 것을 선택할 수 있습니다. 다음은 몇 가지 중요한 맛에 대한 개요와 다른 맛을 구별하는 것입니다. (이 목록은 완전하지는 않지만 정말 눈에 띄는 것을 놓친 경우 알려주십시오.)
펄과 PCRE
나는 Perl 풍미에 너무 익숙하지 않기 때문에 이것을 단일 냄비에 던지고 있으며 대부분 동등합니다 (PCRE는 결국 Perl 호환 정규 표현식 용입니다). Perl 플레이버의 주요 장점은 정규식과 대체 내부에서 실제로 Perl 코드를 호출 할 수 있다는 것입니다.
- 재귀 / 서브 루틴 . 아마도 골프를위한 가장 중요한 특징 일 것입니다 (몇 가지 맛에만 존재 함).
- 조건부 패턴
(?(group)yes|no)
.
- 지원이와 대체 문자열에서 경우의 변경
\l
, \u
, \L
와 \U
.
- PCRE는 각 대안이 길이는 다르지만 고정 된 길이를 가질 수있는 lookbehinds에서의 교체를 허용합니다. (Perl을 포함한 대부분의 맛은 전체 고정 길이를 갖도록 lookbehinds가 필요합니다.)
\G
이전 경기의 끝에 경기를 고정합니다.
\K
경기의 시작을 재설정
- PCRE는 유니 코드 문자 속성과 스크립트를 모두 지원합니다 .
\Q...\E
더 긴 문자를 피하기 위해. 많은 메타 문자가 포함 된 문자열을 일치 시키려고 할 때 유용합니다.
.그물
이것은 아마도 가장 약한 단점 일 것입니다.
골프와 관련하여 한 가지 중요한 단점은 다른 맛과 같은 소유 수량자를 지원하지 않는다는 것입니다. 대신 .?+
을 작성해야합니다 (?>.?)
.
자바
- 버그로 인해 자바 가변 길이 lookbehind의 제한된 유형을 지원 (부록 참조) : 당신이 문자열의 시작 부분에 모든 방법을 lookbehind 수 있습니다
.*
당신이 지금처럼 내다을 시작할 수있는 곳에서 (?<=(?=lookahead).*)
.
- 캐릭터 클래스의 결합 및 교차를 지원합니다.
- "유니 코드 스크립트, 블록, 범주 및 이진 속성"에 대한 문자 클래스를 사용하여 유니 코드를 가장 광범위하게 지원합니다 .
\Q...\E
Perl / PCRE에서와 같이.
루비
최신 버전에서이 특징은 서브 루틴 호출 지원을 포함하여 PCRE와 유사하게 강력합니다. Java와 마찬가지로 문자 클래스의 통합 및 교차를 지원합니다. 한 가지 특별한 기능은 16 진수를위한 내장 문자 클래스입니다 \h
(및 부정 \H
).
골프를 치는 데 가장 유용한 기능은 Ruby가 수량자를 처리하는 방법입니다. 특히 괄호없이 수량자를 중첩 할 수 있습니다. .{5,7}+
작동합니다 .{3}?
. 또한, 대부분의 다른 풍미와는 달리, 정량 자상의 하한 0
이 생략되면, 예 .{,5}
를 들어와 동일하다 .{0,5}
.
서브 루틴으로서, PCRE의 서브 루틴 루비의 서브 루틴의 주요 차이점은, 루비 구문 바이트 이상이다 (?n)
VS \g<n>
하지만 PCRE 서브 루틴이 완료된 후 캡처를 리셋 반면 루비 루틴은 촬영에 사용될 수있다.
마지막으로, Ruby는 다른 맛과는 달리 라인 관련 수정 자에 대한 의미가 다릅니다. 일반적으로 m
다른 맛에서 호출되는 수정자는 루비에서 항상 켜져 있습니다. 그래서 ^
그리고 $
항상의 시작과 끝과 일치 라인 뿐만 아니라 시작과 문자열의 끝을. 이 동작을해야하는 경우는 당신에게 바이트를 저장할 수 있지만, 그렇게하지 않으면 당신은 교체해야하기 때문에, 당신에게 추가 바이트를 비용 ^
과 $
함께 \A
및 \z
각각. 또한 일반적으로 호출되는 수정 자 s
( .
줄 바꿈 일치)는 m
Ruby에서 대신 호출 됩니다. 바이트 수에는 영향을 미치지 않지만 혼동을 피하기 위해 명심해야합니다.
파이썬
파이썬에는 단단한 맛이 있지만 다른 곳에서는 찾을 수없는 특히 유용한 기능을 알지 못합니다.
그러나 ,이 다른 맛을 바꾸기위한 것입니다 re
어느 시점에서 모듈은 재미있는 기능이 많이 포함되어있다. 재귀, 가변 길이 lookbehinds 및 문자 클래스 조합 연산자에 대한 지원을 추가 할뿐만 아니라 퍼지 매칭 의 고유 한 기능도 있습니다 . 본질적으로 허용되는 많은 오류 (삽입, 삭제, 대체)를 지정할 수 있으며 엔진은 대략적인 일치도 제공합니다.
ECMAScript
ECMAScript의 풍미는 매우 제한적이므로 골프에 거의 유용하지 않습니다. 그것이 유일하게 진행 되는 것은 무조건 빈 캐릭터 클래스뿐만 아니라 (일반적인 것과는 달리) 모든 캐릭터와 일치 하는 부정 된 빈 캐릭터 클래스 입니다. 불행히도,이 풍미에는 후자의 정상적인 문제에 유용한 특징이 없습니다.[^]
[]
(?!)
루아
루아 (Lua)는 상당히 독특한 맛을 지니고 있습니다. 예를 들어 그룹을 정량화 할 수는 없지만 유용하고 흥미로운 기능이 몇 가지 있습니다.
- 구두점, 대문자 / 소문자 및 16 진수를 포함하여 내장 문자 클래스를 위한 많은 속기가 있습니다.
- 으로
%b
는 매우 컴팩트 한 구문을 지원 균형 문자열하였습니다. 예를 들어 %b()
a (
와 일치하는 모든 항목을 일치 )
시킵니다 (내부 일치하는 쌍을 올바르게 건너 뛰기). (
그리고 )
여기에 두 문자를 할 수 있습니다.
후원
Boost의 정규식 맛 은 본질적으로 Perl입니다. 그러나 대소 문자 변경 및 조건을 포함하여 정규식 대체를위한 몇 가지 새로운 기능이 있습니다 . 후자는 내가 아는 한 부스트 고유합니다.