2017-05-02 8 views
1

정규 표현식을 사용하는 JavaScript 코드를 생성 할 때 문자열 변수에서 정규 표현식 패턴을 삽입 할 때 문제가 발생합니다. 콘텐츠는 리소스 파일에서 읽습니다.리소스에서 정규 표현식 패턴을 문자열에 삽입하는 방법. 형식?

string.Format을 사용하여 템플릿 문자열에 삽입 할 때 백 슬래시 해석에 문제가있는 것으로 보입니다. 자바 스크립트는 괜찮은 것 같습니다. 그러나 정규식이 올바른 텍스트와 일치하지 않습니다.

정규 표현식 패턴은 회사 전자 메일의 모양을 정의하며 리소스 파일 (먼저 문자열 변수로 읽음)에 정의됩니다. 모양은 다음과 같습니다 : "\\w+\\.\\[email protected]". 사용자가 [email protected]과 같은 전자 메일과 일치해야합니다. 일치하지 않으면 JavaScript 코드에서 추가 확인을 요청합니다.

동일한 자바 스크립트 (아래 표시된 것처럼)는 하드 와이어 된 경우 정상적으로 작동했습니다. 이 문제는 JavaScript 코드의 동적 정의와 관련이 있습니다.

컨텍스트 : asp.net 단추에 even 처리기가 있으면 클라이언트 쪽 코드를 추가하려고합니다. 코드가 더 많은 회사에서 재사용되어야하기 때문에 패턴이 자원에 있습니다. 국제화 때문에 확인 텍스트가 자원에 있습니다.

protected void btnSave_Init(object sender, EventArgs e) 
    { 
     ASPxButton btn = sender as ASPxButton; 
     string regex = GetLocalResourceObject("btnSave.RegEx").ToString(); 
     string txt = GetLocalResourceObject("btnSave.ConfirmText").ToString(); 
     txt = txt.Replace("\r\n", "\\n"); // must be a single line for JavaScript 
     string fo = @" 
function(s, e) {{ 
    var rex = new RegExp('{0}', 'i'); 
    if (!rex.test(email.GetText())) 
     e.processOnServer = confirm('{1}'); 
}}"; 
     btn.ClientSideEvents.Click = String.Format(fo, regex, txt); 
    } 

업데이트 : 리소스 파일에 기록 된 문자열 \w+\.\[email protected]\.com처럼 보이는 (단일 백 슬래시, 마지막 점의 탈출 고정). 문자열 변수를 읽을 때 백 슬래시는 일반 문자로 처리됩니다. 양식에서 얻은 텍스트는 [email protected]입니다. 정규 표현식 개체를 만드는 줄이 제안 된대로 var rex = /^(?:{0})$/i;으로 변경되었습니다. 표시되지 않은 또 다른 사소한 버그가있었습니다.

+2

리소스 파일에서 정규식을 검색하면 어떻게됩니까? – DigiFriend

+0

테스트를 위해'regex'와'txt'의 값을 공유하십시오. –

+1

JS의'RegExp # test'는 부분 일치를 찾을 것이므로''\\ w + \\. \\ [email protected] ''도'@ # % [email protected]와 같은 문자열과 일치합니다! '. 또한 'com.'이전의'.'은 임의의 문자와 일치하므로 일치 할 것입니다. 'e.f @ company§com'. –

답변

1

요점은 문자형 \w+\.\[email protected]\.com 문자열을 전달해야한다는 것입니다. 즉, 백 슬래시는 리터럴 백 슬래시 기호 여야하며 이스케이프 시퀀스 (줄 바꿈의 경우 \n, 캐리지 리턴의 경우 \r 등)이 아닌 백 슬래시가 아니어야합니다.

그래서 JS에 정규식 만드는 2 가지 방법이있다 : 생성자 표기법 (new RegExp("\\w+\\.\\[email protected]\\.com")) 또는 정규식 리터럴 표기법 (예 /\w+\.\[email protected]\.com/ 상기 \ 정규식 리터럴에서 리터럴 슬래시로 취급 필요 탈출 추가 슬래시 없다). 게다가 정규 표현식에서는 / 심볼을 이스케이프 처리해야합니다.

참고 전체 문자열을 정규식과 비교해야하므로 ^$ 앵커가 필요합니다.

따라서, 당신은

var rex = /^(?:{0})$/i; 

을 필요로하고 regex을 전달할 때, \/ 모든 이스케이프 /를 교체하십시오.

+0

Wiktor에게 감사의 말을 전합니다. 필자는 패턴을 "소스 코드를 사용할 때 백 슬래시 시퀀스를 해석하지 마십시오"라고 표시하는'/'구분 기호를 포함하여 정규 표현식을 알고 있습니다. 나는 더 단순한'/^{0} $/i'을 사용했다. 아니면'(? : xxx)'가 여기서 유용할까요? – pepr

+1

'(? : ...)'는 서브 패턴을 그룹화하는 비 캡처 그룹입니다. '/^{0} $/i'에'one | two' 패턴을 넘겨 주면'/^one | two $/i'가 될 것이고''one ''또는''two '. –

+0

나는 본다. 좋은 지적. ;) – pepr