2010-11-29 2 views
5

boost::regex::perl을 사용하는 나쁘게 주석 처리 된 기존 코드가 있습니다. 이전에 하나의 특정 구성에 대해 궁금해했는데, 코드가 작동했기 때문에 (그 이상), 나는 그것을 만지는 것을 싫어했습니다. 이제boost :: regex - bb?

내가 (더 정확하게, 더 이상 구조를 수용 부스트의 최신 버전), 그래서 그것을 무엇을 파악해야 기술적 인 이유로, 그것을 터치이 - 또는 오히려이었다 의도 할 것.

정규식의 관련 부분 :

(?<!(\bb\s|\bb|^[a-z]\s|^[a-z])) 

날 두통 준다 조각이 \bb입니다. 나는 \b을 알고 있지만, \bb에 대한 언급을 찾을 수 없으며, 문자 그대로 'b'을 찾는 것이 여기에 적합하지 않을 것입니다. \bb 일부 특수 기능이 저평가되어 있습니까? 아니면 이것을 오타라고 생각합니까? Boost으로

+2

당신이 단순히 시도 할 수 \ bb''만약 일치 "B" ("a"가 아닌) 단어 경계가 아닌 다른 단어가 실제로 "b"뒤에 있는지 확인하십시오. – Jens

+0

글쎄요, 문제는 주석 처리되지 않은 코드와 마찬가지로, 실제로 * 의도 한 것과 상관하지 않을 수도 있다는 것입니다. 나는 오래된 버전 (1.34.1)과 현재의 Boost 버전에 대해 테스트해야하고, 여전히 * 저자 *의 의도를 추측해야한다. – DevSolar

+0

소스를 읽으십시오. (of : boost :: regex :: perl that .. 행운을 빕니다 :) –

답변

3

(\bb\s|\bb|^[a-z]\s|^[a-z])b 일치합니다. 두 경우 모두 문자 다음에 공백 문자가 올 수 있습니다. (대소 문자를 구분하지 않으면 대문자와도 일치 할 수 있으며, 여러 줄 모드가 설정되어 있으면 ^이 줄의 시작과도 일치 할 수 있습니다.) 이 컴파일되어서는 안됩니다.. 어떤 맛에서는 lookbehind가 고정 길이가 다른 여러 대안을 포함 할 수 있지만 전환은 lookbehind의 최상위 레벨에 있어야합니다. 즉, (?<=abc|xy|12345)가 작동하지만 (?<=(abc|xy|12345))은 작동하지 않습니다.그래서 당신의 정규식은 의 맛에서도 작동하지 않을 것이지만, Boost의 워드 프로세서는 lookbehind 표현식이 고정 길이 여야한다고 말합니다. 당신이 정말 정규식 일치 가능성의 네 가지를 설명해야하는 경우

, 난 당신이로 lookbehind을 분할 제안 :

(?<!\bb|^[a-z])(?<!(?:\bb|^[a-z])\s) 
+0

+1 "lookbehind에서 톱 레벨에 교대가 있어야한다"고 지적했다. – DevSolar

4

는 C++에 대한 정규식 엔진 것으로 보인다 및 호환성 모드 하나 펄 호환성입니다 - 그는 "펄 호환"표현 인 경우, 두 번째 'B'이 될 수있는 것보다 문자 그대로.

유효한 표현식으로, 'b'로 시작하는 단어는 매우 특별한 경우입니다.

이것이 C++ 라이브러리라는 결정적인 요소 인 것 같습니다. perl, perl 호환 정규식이 아닌 환경을 제공한다는 것입니다. 따라서 perl이 표현식을 해석 할 수 있다고 생각했던 원래의 생각 (예 : overload::constant)은 유효하지 않습니다. 그러나 "b '로 시작하는 단어를 의미하는 표현을 조정하는 것이 부적절한 것과 관계없이 설명을 목적으로 언급할만한 가치가 있습니다.

그 생각에주의해야 할 점은 아마도 부스트 그 자신의 표현에 펄을가-수행하고 누군가가 부스트 엔진을 사용하는 것입니다 에 펄 환경을 것입니다, 모든 베팅은 그가 가질 수 있는지에 떨어져 있습니다 특별한 표현을 의미합니다. 이것은 문법이 주어지면 단지 하나의 찌르기 일뿐입니다. '!!!' 단어의 시작 부분에 뭔가 특별한 의미,이 같은 기존의 의미를 피기 백 수 (권장하지 않음!)

s/\\bb\b/(?:!!!(\\p{Alpha})|\\bb)/ 

이 할 바보 일 수 있지만 우리가 코드를 다루고로는 부적합 보인다 것 작업에는 수천 가지 방법으로 실패 할 수 있습니다. 가 다른 단어 문자, 또는 는 문자열의 시작 부분에 있다면 어떤 소문자로 시작되어 있지 않은 경우