문제

저는 사용자 입력을 기반으로 정규식을 사용하여 텍스트를 검색하는 응용 프로그램을 개발 중입니다.사용자가 선택할 수 있는 한 가지 옵션은 별표를 사용하여 "0개 이상의 문자 일치" 와일드카드를 포함하는 것입니다.단어 경계 사이에서만 일치시키려면 이것이 필요합니다.나의 첫 번째 시도는 모든 별표를 다음으로 변환하는 것이 었습니다. (?:(?=\B).)*, 대부분의 경우 잘 작동합니다.실패한 부분은 분명히 .Net이 발음 구별 부호가 있는 유니코드 문자와 단어 분리 문자 사이의 위치를 ​​고려한다는 것입니다.나는 이것을 버그라고 생각하여 Microsoft 피드백 사이트.

그러나 그동안 기능을 구현하고 제품을 배송해야 합니다.사용을 고려하고 있습니다 [\p{L}\p{M}\p{N}\p{Pc}]* 대체 텍스트로 사용되지만 솔직히 "이게 어떻게 될지 잘 모르겠습니다" 상태입니다.즉, 사양을 읽을 수는 있지만 예상한 대로 작동하는지 확인할 만큼 충분히 테스트할 수 있을지 확신할 수 없습니다.나는 테스트할 경계 조건을 모두 알지 못할 것입니다.이 응용 프로그램은 다문화 근로자가 사용하며 이들 중 대부분은 부족 지역에 있으므로 너비가 0인 단어 구분을 사용하는 일부를 포함하여 모든 쓰기 시스템이 지원되어야 합니다.

누구든지 더 우아한 솔루션을 가지고 있거나 위의 코드를 확인/수정하거나 몇 가지 조언을 제공할 수 있습니까?

당신의 도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책

동등한 /(?:(?=\B).)*/ 유니코드 컨텍스트에서는 다음과 같습니다.

/
(?:
  (?: (?<=[\p{L}\p{M}\p{N}\p{Pc}]) (?=[\p{L}\p{M}\p{N}\p{Pc}])
  |   (?<![\p{L}\p{M}\p{N}\p{Pc}]) (?![\p{L}\p{M}\p{N}\p{Pc}])
  )
  .
)*
/

...또는 다소 단순화되었습니다.

/(?:[\p{L}\p{M}\p{N}\p{Pc}]+|[^\p{L}\p{M}\p{N}\p{Pc}]+)?/

이는 단어 또는 단어가 아닌 시퀀스(간격, 구두점 등)와 일치하며 비어 있을 수도 있습니다.

일반 또는 부정 단어 경계(\b 또는 \B)는 기본적으로 이중 둘러보기입니다.뒤를 돌아보며 현재 위치 앞에 오는 문자 유형을 확인합니다.마찬가지로 앞을 내다보는 사람.

두 번째 정규식에서는 둘러보기를 제거하고 대신 간단한 문자 클래스를 사용했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top