문제

원천

RegexOptions.IgnoreCase는 생각했던 것보다 더 비쌉니다(예: 거의 측정할 수 없어야 함).

이것이 PHP, Python, Perl, Ruby 등은 물론 C#(Jeff가 사용하고 있다고 가정한 것)에 적용된다고 가정하면 속도 저하가 얼마나 되며 비슷한 페널티가 발생합니까? /[a-zA-z]/ 내가 원하는 대로 /[a-z]/i ?

도움이 되었습니까?

해결책

예, [A-Za-z]는 설정보다 훨씬 빠릅니다. RegexOptions.IgnoreCase, 주로 유니코드 문자열 때문입니다.하지만 이는 훨씬 더 제한적이기도 합니다. [A-Za-z]는 그렇습니다. ~ 아니다 악센트가 있는 국제 문자와 일치하면 말 그대로 A-Za-z ASCII 세트일 뿐이며 그 이상은 아닙니다.

내 메시지에 대한 Tim Bray의 답변을 보셨는지 모르겠지만 좋은 답변입니다.

국제화된 검색에서 가장 까다로운 문제 중 하나는 대문자와 소문자입니다.이러한 대소문자 개념은 라틴어, 그리스어 및 키릴 문자 집합으로 작성된 언어로 제한됩니다.영어 사용자는 게으르기 때문에 자연스럽게 검색이 대소문자를 구분하지 않을 것으로 기대합니다.Nadia Jones가 Google에서 자신을 검색하고 싶다면 아마도 nadia jones를 입력하고 시스템에서 이를 처리해 주기를 기대할 것입니다.

따라서 검색 시스템에서는 인덱싱과 쿼리 모두에서 단어를 모두 소문자 또는 대문자로 변환하여 단어를 "정규화"하는 것이 매우 일반적입니다.

문제는 사례 간의 매핑이 영어처럼 항상 간단하지는 않다는 것입니다.예를 들어, 독일어 소문자 "ß"는 대문자일 때 "SS"가 되고, 터키어에서 소문자일 때 옛 대문자 "I"는 점이 없는 "ı"가 됩니다(예, "i"가 있습니다). 대문자 버전은 "İ"입니다).나는 "é"와 같은 악센트 문자를 대문자로 바꾸는 규칙이 프랑스와 퀘벡에서 다르다는 것을 읽었습니다(직접 확인하지는 않았습니다).이 모든 것의 결과 중 하나는 java.String.toLowerCase()와 같은 소프트웨어가 이러한 모든 특수 사례를 해결하려고 시도할 때 놀라울 정도로 느리게 실행되는 경향이 있다는 것입니다.

http://www.tbray.org/ongoing/When/200x/2003/10/11/SearchI18n

다른 팁

해당 정규식에 숫자와 밑줄이 있는 것을 허용할 수 있다면 다음과 같이 할 수 있습니다.\w 수정자를 사용합니다(Perl 구문).나는 일부 엔진이 [:alpha:]를 지원한다고 생각하지만 그것은 순수한 Perl이 아닙니다.\w는 현재 있는 로케일을 고려하여 대문자와 소문자 모두와 일치하며 대소문자를 무시하면서 [A-Z]를 사용하는 것보다 빠르다고 확신합니다.

이것이 걱정된다면 확인하기 전에 케이스를 모두 상한 또는 모두 하한으로 설정하는 것이 좋습니다.
예를 들어 Perl에서는 다음과 같습니다.

$x = "abbCCDGBAdgfabv";
(lc $x) =~ /bad/;

어떤 경우에는 다음보다 나을 수도 있습니다.

$x = "abbCCDGBAdgfabv";
$x =~ /bad/i;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top