PCRE 정규식의 경우 [abc]와 (a | b | c)의 차이점은 무엇입니까?[abc]와 (a | b | c)의 차이점
답변
질문에있는 패턴이 같은 텍스트와 일치합니다. 구현면에서, 이들은 다른 오토마타 및 부작용 (, 즉, 하위 문자열을 포착하는지 여부)에 해당합니다.
아래의 설명에서 Garrett Albright은 미묘한 차이를 지적합니다. (.|\n)
이 모든 문자와 일치하는 반면에 [.\n]
은 리터럴 점 또는 개행 문자와 일치합니다. 도트가 더 이상 문자 클래스 내에서 특수하지 않지만 , ^
및 ]
과 같은 문자와 [:lower:]
과 같은 시퀀스는 문자 클래스 내에서 특별한 의미를 갖습니다. 한 의미에서 다른 의미로 특수 의미를 유지하는 데주의가 필요하지만 때로는 \1
의 경우와 같이 문자 클래스 외부에 $1
을 쓰는 구식 방법과 같이 ’이 가능한 경우가 있습니다. 문자 클래스 내에서 \1
은 항상 문자 SOH와 일치합니다.
문자 클래스 ([...]
)는 일부 문자 집합 중 하나와 일치하도록 최적화되어 있으며 대안 (x|y
)을 사용하면보다 일반적인 길이의 다양한 선택이 가능합니다. 이러한 디자인 원칙을 염두에두면 더 나은 성능을 얻는 경향이 있습니다. Regex 구현은 /[abc]/
과 같은 소스 코드를 유한 상태 오토마타 (보통 NFAs)로 변환합니다. 우리가 정규식 엔진이라고 생각하는 것은 타겟 상태 머신의 실행을 돕는 부기장입니다. 충분히 똑똑한 정규 표현식 컴파일러는 동일한 정규 표현식에 대해 동일한 기계어 코드를 생성하지만 lurking exponential complexity 때문에 일반 경우에는 어렵고 비용이 많이 듭니다.
regexes에 대한 이론에 대한 접근 방법에 대해서는 Mark Dominus가 “How Regexes Work”을 읽으십시오. 심층 학습을 위해 Peter Linz가 An Introduction to Formal Languages and Automata을 고려하십시오.
언제 다른 하나를 사용 하시겠습니까? "다른 오토마타와 부분 문자열 캡처에 해당합니다."라는 의미는 무엇입니까? 감사합니다 – user1032531
만약 a, b와 c가 단지 글자 일 뿐이라면, (당연한 것 같습니다). 그들이 단어를 나타낼 수 있다면 분명 완전히 다른 의미가 있습니다. – kratenko
나는 '\ n'이나'\ r'와 같은 재미있는 문자들에 대해 대괄호 옵션이 제대로 작동하지 않는 것으로 나타났습니다. 예를 들어, 줄 바꿈 문자를 포함한 FOO와 BAR 사이의 모든 텍스트를 잡으려면'/ FOO ((. | \ n) +) BAR /'는 작동하지만'/ FOO ([. \ n] +) BAR /'는 그렇지 않습니다. 이것은 구현에 따라 다를 수 있습니다. 나는 내 머리 꼭대기에서 떠 올릴 수없는 다른 차이점을 발견했다.어쨌든, 원칙적으로'[ab]'를 더 읽기 쉽기 때문에 먼저 시도해 볼 것입니다. 그리고 나서 일이 제대로 작동하지 않는다면'(a | b)'를 시도해보십시오. –
(Greg의 답변을 읽은 후) : 평가가 다르면 피드를 제공하는 프로그램에 의존해야합니다. 확인하려는 항목을 선택하십시오. 유효한 문자 풀에 대해 확인하고 싶습니까, 아니면 값을 확인하고 싶습니까? - 때로는 같은 것처럼 보일 수도 있지만 그 뒤에는 다른 의도가있을 수 있습니다. 그런 다음 당신의 의도를 반영하는 것을 선택하십시오.
대괄호를 사용하는 양식은 특히 JIT 컴파일을 사용하는 경우 PCRE를 사용하면 훨씬 빠릅니다. 비트 셋의 비트를 확인하는 중일 뿐이지 만 다른 하나는 모든 대안에 대한 문자를 다시 읽습니다. 많은 사람들이 대괄호 안에 문자 클래스를 사용할 수 있다는 것을 모르기 때문에 이러한 경우를 감지하는 최적화를 생각하고 있었고 [a-z \ s] + 대신 [a-z] | \ s) +를 사용했습니다.
관련 항목 [단일 문자 일치에 교대 또는 문자 클래스 사용?] (http://stackoverflow.com/questions/4724588/using-alternation-or-character-class-for-single-character-matching) 답변. – stema
다른 게시물이 도움이되었습니다. 감사합니다 – user1032531