2011-09-17 4 views
4

JavaScript에서 동일한 수의 더미 문자로 문자열의 일부를 대체하려고합니다. '== Hello =='with '== ~~~~~ == '.Javascript Regex- 다른 문자와 동일한 숫자로 문자 시퀀스 교체

이 질문에 대한 답변이 PerlPHP이지만 나는 JavaScript로 작동시키지 못합니다.

txt=txt.replace(/(==)([^=]+)(==)/g, "$1"+Array("$2".length + 1).join('~')+"$3"); 

패턴 일치가 잘 작동하지만 대체하지 않습니다 - 두 번째 부분은 추가 '~~'대신 패턴 일치의 길이 : 나는이 노력했습니다. "$ 2"를 괄호 안에 넣는 것은 효과가 없습니다. 적절한 수의 문자를 삽입하려면 어떻게해야합니까?

+0

관련이/속는 : http://stackoverflow.com/questions/7337995/regex-replace-sequence-of-one-character-with-same-number-of-another-character – blahdiblah

답변

5

대신 교체 기능을 사용하여

var txt = "==Hello=="; 
txt = txt.replace(/(==)([^=]+)(==)/g, function ($0, $1, $2, $3) { 
    return $1 + (new Array($2.length + 1).join("~")) + $3; 
}); 

alert(txt); 
//-> "==~~~~~==" 
0

working sample 다음 조각을 사용하여 코드의 문제는 항상 항상 "$2"의 길이 (문자열을 측정 한 것을

var processed = original.replace(/(==)([^=]+)(==)/g, function(all, before, gone, after){ 
    return before+Array(gone.length+1).join('~')+after; 
}); 

2 자 포함). 이 기능을 사용하여 일치하는 부품의 길이를 측정 할 수 있습니다. 추가 예제는 documentation on replace을 참조하십시오.

+0

귀하 코드에 약간의 오류가있어 예상보다 적은 한 문자를 반환합니다. 이것은 동일한 길이의 대체 문자열을 생성하기 위해 배열 길이가'join()'의 문자열 길이보다 1만큼 커야하기 때문입니다. –

+0

힌트를 주셔서 대단히 감사드립니다. 코드가 수정되었습니다. –

0

$ 2 대체 전에 length 속성을 평가 중이므로 replace()가 작동하지 않습니다. Augustus가 제안한 함수 호출이 작동해야하며, 또 다른 접근법은 replace() 대신 match()를 사용하는 것입니다.

/g를 사용하지 않고 match()를 사용하면 원하는대로 조인 할 수있는 일치 결과의 배열을 반환합니다.

txt="==Hello=="; 
mat=txt.match(/(==)([^=]+)(==)/); // mat is now ["==Hello==","==","Hello","=="] 
txt=mat[1]+Array(mat[2].length+1).join("~")+mat[3]; // txt is now "==~~~~~==" 

당신은 중간 표현에서 선도적 인/후행 문자를 제외,하지만 당신은 더 많은 유연성을 원하는 경우이 작업을 사용하고 선도/후행 리터럴에 의해 괄호 아무것도 처리 할 수 ​​있습니다. 순수 정규식에 대한

mat=txt.match(/(^==)(.+)(==$)/)