2010-12-02 6 views
2

여러 줄로 된 텍스트 상자 (텍스트 영역)에 특정 문자열이 있는지 확인하고 싶습니다. 나는 시도했다 :RegularExpressionValidator 여러 줄 텍스트 상자 (텍스트 영역)에서 느림

<asp:RegularExpressionValidator runat="server" ControlToValidate="txtTemplate" ValidationExpression="^(.\s*)*Content(.\s*)*$" Text="content" ErrorMessage="Must contain: Content" /> 

^(.\s*)*$이 텍스트 영역에 대해 전달하는 것 사용. 그래서 저는이 두 가지 사이에 기준을 끼워 넣으려고했습니다. 그러나 그것은 IE와 크롬을 모두 잠그고있는 것처럼 보입니다.

이것은 간단해야하며, 내가 필요로하는 것보다 더 힘들게 만들고 있다고 생각합니다.

답변

4

시도 (즉, 무슨 runat="server" 수단 그렇지?), 간단한 해결책이 정규식 사용하는 것이 아마도 :

(?s)^.*Content.*$ 

(?s)Singleline 모드를 켜기 때문에 . 메타 문자는 ( 줄 바꿈 포함) 모든 문자와 일치 할 수 있습니다. 당신이뿐만 아니라 클라이언트에서 실행하려면이를 사용 : 자바 스크립트는 DOT_ALL, DOTALL, 점 - 경기 - 모든, 단일로 알려진 Singleline 모드 (대한 해당이 없기 때문이다

^[\s\S]*Content[\s\S]*$ 

라인 또는 /s 모드). (?s)(?i)과 같은 인라인 수정 자도 인식하지 못합니다.

한정자 (*, + 등)가있는 표현식이 한정 기호로 제어되는 그룹에 포함되어있는 (.\s*)*과 같은 구문을 조심하십시오. 정규식이 일치하는 항목을 바로 얻지 못하면 다시 돌아가서 다른 경로 (즉, 문자열의 다른 부분을 일치시키는 정규 표현식의 다른 부분을 사용)로 일치 시키려고 시도합니다. 이는 매우 비싸고 성능면에서 좋지 않을 수 있습니다. .\s은 많은 문자와 일치 할 수 있기 때문에이 정규식은 특히 나쁩니다. 따라서 포기하기 전에 탐색해야하는 경로의 수가 크게 늘어납니다.

현상은 일반적으로 catastrophic backtracking으로 알려져 있으며 일반적으로 일치 할 가능성이없는 경우에 나타납니다. Content 시퀀스가있을 때 유효성 검사기가 잘 작동 할 것으로 기대합니다. 당신은 단지 전체 단어 Content에 일치 할 경우 그런데

, 당신과 같이, 단어 경계를 추가해야합니다 : MalContentContentious 같은 단어에 대한 오 탐지를 방지 할 수

(?s)^.*\bContent\b.*$ 

합니다. \b은 다른 정규 표현식에서 다르게 작동합니다. .NET에서 ECMAScript 모드를 지정하지 않으면 유니 코드를 인식합니다.자바 스크립트에서는 ASCII 문자와 숫자 만 단어 문자로 인식합니다. 대부분의 브라우저에서 그렇지만이를 당연한 것으로 받아들이지는 않습니다.

+0

굉장한 대답. 클라이언트 측에서 실행되기를 원했기 때문에 (\ runt = "server"는 서버가 태그를 해석해야 함을 의미하고, EnableClientScript = "false"는 서버에서만 실행합니다) . – Eric

0

저는 .*Content.*과 같은 정규 표현식이 더 효과적이고 더 빠를 것이라고 생각합니다. 또한 JavaScript가 문자열의 텍스트를 검색하는 성능 드래그 인 경우 사용자 정의 유효성 검사기를 구현할 수도 있습니다. 검증은 항상 서버에서 수행되는 경우

+0

작동하지 않습니다. 그 기간은 개행을 포착하지 못하기 때문에 "\ s"(공백)을 포함하게되었습니다. 나는 사용자 정의 유효성 검사기를 할 수 있지만 코드의 8 줄이 더 비슷하다. :) – Eric

1

[\S\s]*Content[\S\s]* 
관련 문제