2010-07-26 4 views
2

사용자로부터 임의의 정규 표현식을 수락하고 전체 일치를 적용하기 위해 양측에 고정하려면 (^<user's-regex>$) 그러나 사실을 고려해야하는지는 알 수 없습니다. 사용자가 이미 정규 표현식을 고정했을 수 있습니다.정규 표현식을 이중 고정

Perl, C++, .NET 및 JavaScript 모두 허용됩니다. double 다중 앵커링.

"hello" =~ /^h/ # true 
"hello" =~ /^^h/ # true 
"hello" =~ /^^^h/ # true 
"hello" =~ /e/ # true 
"hello" =~ /^e/ # false 
"hello" =~ /^^e/ # false 

이 방법으로 작동하도록 지정되어 있는지 알 수 있습니까? 이 행동에 의존 할 수 있습니까, 아니면 미래에 변할 수있는 사고입니까?


편집 : 그것은 .*a.*에 문자열 abc에 맞게 훨씬 느린 그래서 그러나이 모든 일치를 반환 우리가이 필요한 이유는 우리가, 우리가 match를 VBScript를의 정규식의 (COM)에서 사용하고 사용하고 있다는 것입니다 ^.*a.*$보다. @Tim에 의해 제안 된 앵커링을 사용하면 (긴 문자열 인 경우) 속도가 12 배 이상 일치합니다.

+0

왜 필요합니까? – SilentGhost

답변

4

이 동작에 의존 할 수 있습니다. 정규식 엔진은 한 번, 두 번 또는 백 번 연속해서 동일한 것을 주장하는 데 별 상관이 없습니다.

그러나, 대신 단순히 정규식 주위에 앵커를 추가, 당신은 또한 주위에 비 캡처 그룹을 추가해야합니다

^(?: - 사용자 정규식 - )$ 바람직하게, 당신의 정규식 맛이 허용하는 경우 : \A(?: - 사용자 정규식 - )\Z

그렇지 않으면 사용자가 정규식에서 교번을 사용하면 위로 이동합니다. 비교 :

user regex:   hello|bye 
anchored regex:  ^hello|bye$  // alternation now affects anchors 
correctly anchored: ^(?:hello|bye)$ 
+0

동기 부여와 함께 질문을 업데이트하고 있습니다. 귀하의 답변이 도움이되었습니다. – Motti

관련 문제