2009-03-10 4 views
2

내 검색 응용 프로그램에서 posix c regex 라이브러리 (regcomp/regexec)를 사용하고 있습니다. 내 응용 프로그램은 멀티 바이트 문자를 사용하는 언어를 포함하여 다른 언어를 지원합니다. 단어 경계 메타 문자 (\ b)를 사용할 때 문제가 발생했습니다. 단일 바이트 문자열을 , 그것은 예를 들어, 잘 작동 : 정규식 및 쿼리 문자열이 멀티 바이트를하는 경우다중 바이트 문자열에 대한 정규식 단어 경계

그러나

"\ bpaper \ B"일치 "종이", 그것은하지 않는 것 제대로 작동하는, 예를 들면 :

"\ B 紙張 \ b"를 일치하지 않습니다 "紙張"

내가 실종 무엇인가? 어떤 도움을 주시면 감사하겠습니다.

요청 정보 :

  • 프로그래밍 언어 : C
  • 정규식 라이브러리 : GNU C (regex.h)

감사합니다.

+0

RegExp에 어떤 프로그래밍 언어/라이브러리를 사용하고 계신지 말씀해주십시오. –

+0

@Ferdinand : 요청 된 정보가 추가되었습니다. –

답변

4

,

"멀티 바이트는"이 상황에서 무엇입니까 제대로 작동하지 않는 것? UTF-8 바이트로 인코딩 된 문자열? GB와 같은 로케일 특정 멀티 바이트 인코딩?

너비가 넓은 (유니 코드) 문자열을 기본적으로 처리하지 않는다면 ASCII가 아닌 문자에 대해서는 더 이상 지원하지 않을 것입니다. POSIX regex는 ASCII 범위를 벗어나는 바이트에 대한 문자 클래스를 지정하지 않으므로 "\ xe7 \ xb4 \ x99"('紙'의 UTF-8 표현)에있는 바이트를 고려할 수 없습니다 단어 - 글자; 따라서 단어 경계가 보이지 않습니다.

유니 코드의 문자 또는 단어는 간단한 ASCII 정규식보다 복잡한 질문입니다. (. 그리고 분명, 어떤 중국어에서 '말'을 구성하는 것은 그 자체로 논쟁의 여지가있다)를 감지 할 모든 일반 오래된 공간의 경우, 명시 적으로 그렇게 할 수 있습니다 :

(\s|^)紙張(\s|$) 
+0

UTF-8 바이트를 의미했습니다. 단어 경계 메타 문자는 단어 클래스에 대해서만 작동한다는 것을 깨달았습니다. 기술적으로는 영숫자 + _를 의미합니다. 이것은 나를 위해 일했습니다! 감사! =) –

0

저는 이것이 당신이 사용하고있는 라이브러리/프로그래밍 언어와 RegExp 라이브러리의 구성에 달려 있다고 생각합니다. 아마도 멀티 바이트 지원을 켜고 라이브러리에 사용중인 문자 인코딩을 알려 주거나 이에 따라 로켈 설정을 편집해야합니다. \ b 또는 \ w와 같은 일부 특수 작업은 이러한 설정에 따라 다릅니다. 정규식 및 쿼리 문자열이 멀티 바이트 인 경우

0

유니 코드 워드에 대한 자세한위한 this answer을 참조하십시오 경계. 주어진 해결책은 PCRE 라이브러리에 적용 할 수 있지만 원칙은 다른 사람들을 위해서도 유지되어야합니다.

관련 문제