2011-02-04 4 views
1

그런 정규 표현식을 컴파일 할 때 RAM의 70 %까지 차지하는 이유는 무엇입니까? 16 :

strcpy(regexStr,"^[a-z]{0,20000}$"); 
regcomp(&regex , regexStr , REG_NOSUB | REG_EXTENDED); 

실행 시간은 분 단위입니다 (이전에 프로세스를 종료해야 함). ^[a-z]{0,2000}$ (2,000 개가 아니라 20,000 개)의 실행은 약 100ms이며 이는 나에게 많은 의미가 있습니다.

패턴을 확인하고 동시에 길이를 확인하는 데이 방법을 사용합니다. Ï 모두에게 편리한 정규 표현식을 찾았습니다. 내가 뭔가 잘못하고 있는거야?

+2

어떤 정규식 엔진을 사용하고 있습니까? – marcog

+0

@marco : 언어가 작동하는 한 C 또는 C++ ('strcpy','regcomp') 만 추측 할 수 있습니다. –

+0

@Matt 분명하지만 많은 C++ 정규식 엔진이 있습니다. – marcog

답변

10

문자열 길이를 측정하기 위해 strlen을 사용하고 비 영문자가 없는지 테스트하기 위해 정규식 /[^a-z]/을 사용하는 것이 좋습니다. 키스.

아직 성취하지 못하는 이유에 대해서는별로 좋은 이유가 없습니다. 버그 나 가난한 디자인을 포함하지 않는 분명히

* 좋은 이유 ...

편집 : 밝혀, 그것은 poor design

EDIT2의 경우 실제로있을 수 있습니다 : 당신이하고있는 검사이기 때문에 실제로 일반 C에서 구현할 수있는 아주 간단합니다 :

int i; 
for (i=0; i<20000 && str[i]!=0; i++) 
    if (str[i] < 'a' || str[i] > 'z') 
    return -1; 
return i; 

가 -1 반환하는 경우, 문자열은 az 범위를 벗어나는 문자가 포함되어 있습니다; 문자열이 20000 문자보다 길면 20000을 반환합니다. 그렇지 않으면 문자열 길이를 반환합니다. (참고 : 이것은 굵은 문자가 아닌 문자열에서만 작동합니다)

+1

491 담당자가 있으면 실제 답변을 편집 할 수 있습니다. 그렇지 않다면, 당신이 원하는 담당자에게 가까이 갈 수있는 엄지 손가락입니다. – KeithS

+0

죄송합니다. 죄송합니다. 편집 됨. – CAFxX

+0

나는 두 가지를 동시에 할 수 있기를 바란다. (필자는 정의와 구조체를 기반으로하는 일종의 입력 매개 변수 파서/검사기를 설치했다.) 구문 분석 구조에 "길이"필드를 추가 할 것이다. – SCO

0

컴파일러에게 수행 할 작업을 고려해야합니다. 순진한 방법으로, 정규 표현식 컴파일은 정규 표현식과 일치하는 문자열만을 받아들이는 유한 상태 기계의 구축이라고 생각할 수 있습니다. 얼마나 많은 문자가 문자열에 있는지 추적해야하는 시스템의 상태 크기를 고려하면 현재 정규식에 문제가 있는지 확인해야합니다.

+0

이것은 CAFxX의 링크에서 매우 명확합니다. 모든 것을 읽지는 않지만 유망 해 보입니다. 최대한 자세히 살펴 보겠습니다. – SCO

1

제 생각 엔 카디널리티 범위가 당신을 죽이는 것입니다. 최대 길이 검사와 함께 욕심 많은 비 특정 카디널리티 일치 (예 : "^[a-z]*$")를 사용해보세요. 훨씬 빨라야합니다.

+0

고마워요! – SCO

4

후드 아래에서 정규 표현식 엔진이 패턴을 ^(|[a-z]|[a-z][a-z]|[a-z][a-z][a-z]|..)$과 같은 카디널리티로 변환하고 있습니다.이 패턴은 범위의 카디널리티에서 2 차입니다.

+0

분명히 디자인입니다. "결함"이라고 생각합니다. 고맙습니다! 고맙습니다! – SCO