2012-04-30 3 views
0

저는 자바 스크립트로 작업하고 있지만 일반적인 정규식 질문이라고 생각합니다.등거리 문자에 대한 특정 정규식 검색 최적화

문자 사이의 거리가 같은 긴 문자열의 하위 문자열을 검색하는 스크립트를 작성하고 있습니다. 예를 들어, 텍스트 a11b22c33d44에서 두 개의 연속 된 문자 사이에 거리가 2 인 문자열 abcd이 있습니다.

위의 예제에서 정규 표현식 /a.{2}b.{2}c.{2}d/을 검색하면 regexp 검색을 사용하여 이러한 문자열을 찾는 것이 간단합니다. 제가 지금하고있는 일은 이것입니다 : 검색 할 단어와 연속 된 문자 사이의 거리를 주어 간단히 .{n} (n은 거리) 사이에 넣고 이것을 정규 표현식으로 컴파일하고 나머지 작업을하도록하십시오. .

글자 사이의 거리가 작 으면 (예 : 약 1000)이 방법은 실제로 잘 작동합니다. 이후에는 속도가 느려집니다. 여전히 작동하지만 동일한 검색을보다 효율적으로 수행 할 수있는 또 다른 방법이 있기를 바랍니다. 더 큰 차이가 나는 이유는 분명하지 않습니다. (전체 텍스트를 한 번만 읽어야합니다.)

+0

당신은 regexp'a. {2} b. {2} c. {2} d'도'aaabbbcccd '와 일치 할 것입니다 - 이것은 의도적입니까? – hochl

+0

예, aaabbbcccd에는 문자 사이에 거리가 2 인 부분 문자열로 "abcd"가 포함되어 있기 때문입니다. –

답변

1

문제는 점이 문자를 포함하여 거의 모든 문자와 일치 할 수 있다는 것입니다. . a이 발견 될 때마다 다음 n자를 중얼 거리고 b과 일치하는 것을 찾으십시오. 그것은 낭비되는 많은 노력입니다.

당신은 에 대해 더 구체적으로해야합니다. 일치하지 않으려면이 필요합니다. 검색어는 항상 문자로 완전히 구성됩니다 예를 들어, 당신은 변경하여 많은 일들을 빠르게 할 수있는 . 또 다른 가능성은 다음 필요한 문자를 제외하고 아무것도 일치하는 것이다

/a[^a-z]{1000}b[^a-z]{1000}c[^a-z]{1000}d/i 

[^a-z]에 :

/a[^b]{1000}b[^c]{1000}c[^d]{1000}d/i 

두 가지 해결책은 필수 문자 사이의 텍스트에 동일한 문자가 포함될 수 없다는 가정에 기반합니다. 당신은 전체 단어 만 검색하는, 당신은 항상 단어 문자 될 것입니다 검색어의 첫 번째와 마지막 문자를 알고있는 경우 다시 그런

, 어쩌면 당신은 단어 경계를 추가해야합니다

/\ba.{1000}b.{1000}c.{1000}d\b/i 
+0

감사합니다. 문제는 중간에 글자가 없을 것이라고 생각할 수 없다는 것입니다 (거의 확실하게있을 것입니다). –

관련 문제