2009-05-23 4 views
2

우선 해킹 코드를 사용 해보세요.이 코드를 시험해보고 싶습니다. 처음으로 자바 스크립트를 배우고 있습니다. 기본적으로 "abc! random {3}"문자열은 "abc"로 시작하고 0-3의 임의의 숫자로 끝나는 문자열을 반환한다는 것을 의미합니다.정규식은 자바 중첩 문제와 일치합니다.

var pattern=/!random{([^{]*?)}/gi; 
var text="abc!random{3}def!random{4}ghi!random{!random{3}}"; 

while (pattern.test(text)) 
{ 
    text=text.replace(pattern, Math.random() * parseInt("$1")); 
} 

문제가에서는 parseInt 함수이다 : 여기

내가 가진 것입니다. $ 1이 전달되지 않은 것처럼 보입니다. 그 값이 지워지거나 뭔가가 나온 것 같습니다. 내가 할 경우 :

text=text.replace(pattern, "$1"); 

정확히 {} 사이에있는 값을 반환하므로 정규식이 작동하고 일치 항목이 $ 1에 저장됩니다. 그러나 $ 1에 매개 변수로 사용하자마자 값이 지워지는 것처럼 보입니다. 뭐라 구요?

답변

5

두 번째 매개 변수를 시도 할 것이다 존재하는 경우, 모든 차례 나오는의 내 $ 1, $ 2 등은 캡처로 대체되거나 두 매개 변수 (일치 및 캡처)를 사용하여 캡처에 대한 대체 문자열을 반환하는 함수가 될 수 있습니다.

var pattern=/!random{([^{]*?)}/gi; 
var text="abc!random{3}def!random{4}ghi!random{!random{3}}"; 

text=text.replace(pattern, 
    function(match,capture) 
    { 
     return Math.random() * parseInt(capture) 
    }); 
WScript.echo(text); 

while 루프는 불필요합니다. 정규 표현식에 전역 플래그 집합 ("g")이 이미 있습니다.이 플래그는 전역 적으로 정규 표현식을 처리합니다.

함수는 실제로 여러 개의 인수 (m)를받습니다. 1 = 일치하는 문자열, 2..m = 왼쪽에서 오른쪽으로 캡처, m + 2 = 일치가 발생한 문자열 내의 오프셋 및 m + 3 = 일치하는 전체 문자열입니다. JavaScript는 (함수의) 가장 오른쪽의 인수를 생략 할 수 있도록 해줍니다. 따라서이 예에는 두 가지만 있습니다.

+0

함수가되는 두 번째 매개 변수가 JavaScript의 표준 구현입니까? 문서 링크를 제공 할 수 있다면 정말 멋진 기능 임에도 불구하고 문서화 된 적이 없으므로 완벽 할 것입니다.) – BYK

+0

ECMAScript 표준의 일부입니다 - http://bclary.com/2004/11/ 07/# a-15.5.4.11 – James

+0

1999 년 12 월 ECMAScript 표준의 15.5.4.11 절 참조 : http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf. 다음은 동일한 내용을 설명하는 MSDN 페이지에 대한 직접 링크입니다. http://msdn.microsoft.com/en-us/library/t0kbytzc(VS.85).aspx. –

0

replace 메서드는 전달 된 값에서 작동합니다. 즉, $ 0, $ 1 등이 포함 된 문자열을 얻으면 올바른 문자열로 바꿉니다. 그러나, 당신이 썼던 것은 먼저 문자열 "$1"을 정수로 파싱하고, 난수로 곱한 다음이를 대체 문자열로 전달합니다. 따라서 거의 확실하게 NaN (구문을 분석 할 수 없기 때문에 "$1")을 전달합니다. 이는 원하는 내용이 아닙니다.

그래서, 대신

text = text.replace(pattern, Math.random() * parseInt("$1")); 

의 나는, 전체 일치를 대체 할 문자열이 될 수 있습니다 교체

var matches = text.match(pattern); 
text = text.replace(pattern, Math.random() * parseInt(matches[1])); 
+0

작동하지 않았습니다. matches [1]은 캡쳐 된 그룹이 아니라 전체 문자열을 반환합니다. (이것은 {} 사이에있는 것입니다) – ryeguy