2013-05-12 2 views
-3

텍스트 상자의 내용이 유효한 전자 메일 주소가 아닌 것으로 보이는 경우 사용자의 입력을 모두 억제하려고합니다. 이것은 사용자 유형을 입력하고 텍스트 상자를 떠난 후 검사가 아니며, 사용자가 입력 할 때 검사하고 텍스트가 유효하지 않은 이메일 주소로 보이면 입력을 억제합니다. 예를 들어 사용자가 'ilove.net'을 입력하면 유효한 전자 메일 주소의 첫 번째 부분으로 알려져 있습니다. (모든 항목이 지금도 정상입니다.) 사용자가 '@'를 입력하면 텍스트가 계속 OK입니다. 이메일 주소의 첫 번째 부분입니다. 그러나 사용자가 다음에 '@'를 입력하면이 두 번째 '@'이후에 사용자가 입력 한 내용에 상관없이 잘못된 전자 메일 주소로 인식되어 입력이 표시되지 않습니다.RegEx 엔진이이 정규식으로 천천히 작동합니다. 보시겠습니까?

RegEx regEx = new RegEx(@"^(?!(\d|\s|-|[.]))([^.-]*[.]?[^. -]+)[email protected]([^-. ]+[.][^-. ]+)+(?<=\D)$"); 
string basicSampleEmailAddress = "[email protected]"; 
private void textEmail_KeyPress(object sender, KeyPressEventArgs e){ 
    string current = textBoxEmail.Text.Insert(textBoxEmail.SelectionStart,e.KeyChar.ToString()); 
    bool matchable = false; 
    for(int i = basicSampleEmailAddress.Length-1; i >= 0; i--){ 
     if(regEx.IsMatch(string.Format("{0}{1}",current,basicSampleEmailAddress.Substring(i))) { matchable=true; break;} 
    } 
    e.Handled = !matchable; 
} 

이 내가 textEmail (텍스트 상자)에 첫 번째 5-7 문자를 입력 할 때 확인을 작동하는 것 같다, 그러나 '느린 처리'내가 입력하면 볼 수 있습니다 : 여기

내 첫 번째 시도이다 다음 문자 및 심지어 내가 빨리 입력하면 내 응용 프로그램이 뭔가 얼어 붙어서 (나는 그것이 RegEx와 관련이 있다고 생각한다), CPU 사용률은 약 20 %이고 양식 제목에는 '응답하지 않음'이라는 텍스트가 추가됩니다. 사실, 일단 얼어 붙은 상태가되면 정상으로 만들 수 없습니다. VS Studio를 통해 응용 프로그램을 중지해야합니다.

지금, 나는 또 다른 표현을 시도하고 모든 확인을 작동합니다 코드는 나는이 일에 정규 표현식으로 변경하는 것을 제외하고 위의 모든 동일합니다 의미

regEx = new Regex(@"(?i)^[0-9a-z_]{3,}((\.[0-9a-z]+)+)[email protected][a-z]+(\.[a-z0-9]+)+$"); 

을 문제 첫 번째 시도에서 표현식으로 인해 발생합니다. 첫 번째 표현을 할 때 왜 너무 느린지 알고 싶습니다. 내가 RegEx를 알았고 그와 사랑에 빠진 이후 RegEx는 매우 빨라졌으며 속도는 입력 문자열에 거의 달려 있다고 생각합니다. 표현에 크게 의존하지 않습니다.

도움을 주시면 대단히 감사하겠습니다.

+0

통상 용액 : 각각의 키에 대한 타이머를 재설정 중지 입력에 타이머를 시작 , 후 800ms 타이머 화재, 그리고 그 코드를 실행 ... –

+0

나는 타이머를 사용하고 싶지 않아, 사실 이제 내 두 번째 표현과 함께 괜찮습니다 . RegEx가 너무 느리도록 처음에는 무엇이 잘못되었는지 알고 싶습니다. 감사! –

+3

전자 메일 정규식에주의하십시오. 올바른 정보를 얻기가 매우 어렵습니다. 예를 들어, 두 번째 정규식은'foo + bar @ buz.com'이 유효한 이메일 주소가 아니라고 잘못 말합니다. –

답변

2

이 부분은 ([^.-]*[.]?[^. -]+)+ (@ 기호 앞에)로 인해 문제가 발생합니다. 입력이 [email protected] 인 경우, 역 추적 중에 [email protected]이 서브 패턴 ([^.-]*[.]?[^. -]+)+에 맞도록 여러 가지 방법이 있습니다. 여기에는 놀라운 것이 없습니다. [^. -]+@과 일치 할 수 있기 때문에 엔진은 앞으로 앞으로 당기고 나중에 다시 추적합니다. 실패한 경기에서 되돌아 오는 경우 아래

([^.-]*[.]?[^. -]+)+에 대한 [email protected] 일치에 성공한 시도를 보여줍니다

([email protected] [empty] d) 
([email protected] [empty] id) 
([email protected] [empty] i) ([empty] [empty] d) 
([email protected] [empty] lid) 
([email protected] [empty] li) ([empty] [empty] d) 
([email protected] [empty] l) (i [empty] d) 
([email protected] [empty] l) ([empty] [empty] id) 
([email protected] [empty] l) ([empty] [empty] i) ([empty] [empty] d) 
([email protected] [empty] alid) 
... 

()([^.-]*[.]?[^. -]+)+의 각 반복에 의해 텍스트 이상형, () 내부의 3 개 부분은 [.]?[^.-]*에 의해 일치하는 텍스트에 해당 및 [^. -]+.

여기서 알 수 있듯이 엔진은 쓸데없는 역 추적 작업을하고 있습니다. 문제는 일치하는 항목이 없을 때 엔진에서 너무 많은 길을 되돌릴 수 있도록 허용한다는 것입니다. 이 공지 사항 :

+0

나는 나의 첫번째 표현이 시험 할 데모와 같다는 것을 인정해야한다. 심지어 올바른 이메일 주소를 걸러 낼 수 없을지라도 문제는 당신이 설명했던 것과 같다. 당신의 도움을 주셔서 감사합니다! –

관련 문제