javascript - 특수문자 - 문자열 변수를 사용하여 즉시 RegExps 만들기




자바스크립트 배열 (4)

다음과 같이 재사용 할 수있게하려고합니다.

function replace_foo(target, replacement) {
   return target.replace("string_to_replace",replacement);
}

나는 다음과 같이 할 수있다.

function replace_foo(target, string_to_replace, replacement) {
   return target.replace(string_to_replace,replacement);
}

문자열 리터럴을 사용하면 충분합니다. 하지만 정규식으로 좀 더 까다로워지기를 원하면 어떻게해야할까요? 예를 들어, string_to_replace 모든 것을 string_to_replace 합니다. 본능적으로 나는 위와 같은 것을 확장하려고 노력할 것이다 :

function replace_foo(target, string_to_replace, replacement) {
   return target.replace(/^string_to_replace/,replacement);
}

이것은 효과가없는 것 같습니다. 내 생각 string_to_replace 는 문자열을 나타내는 변수가 아니라 문자열 리터럴이라고 생각합니다. 문자열 변수를 사용하여 JavaScript 정규 표현식을 즉석에서 작성할 수 있습니까? 이 모든 것이 가능하다면 아주 좋을 것입니다 :

function replace_foo(target, string_to_replace, replacement) {
   var regex = "/^" + string_to_replace + "/";
   return target.replace(regex,replacement);
}

https://code.i-harness.com


문자열 리터럴을 사용하면 충분합니다.

별로! 이 예제는 string_to_replace첫 번째 항목 만 바꿉니다. 더 일반적으로 모든 경우를 바꾸려면 문자열을 전역 ( /.../g ) RegExp로 변환해야합니다. new RegExp 생성자를 사용하여 문자열에서이 작업을 수행 할 수 있습니다.

new RegExp(string_to_replace, 'g')

이 문제는 문자열 리터럴에있는 모든 정규식 특수 문자가 일반 문자가 아닌 특별한 방법으로 작동한다는 것입니다. 문제를 해결하려면 백 슬래시 - 이스케이프 처리해야합니다. 불행히도이 작업을 수행 할 수있는 내장 함수가 없으므로 다음과 같이 사용할 수 있습니다.

function escapeRegExp(s) {
    return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
}

또한 replace() 에서 RegExp를 사용하면 대체 문자열에도 $ 라는 특수 문자가 포함됩니다. 대체 텍스트에 리터럴 $ 를 사용하려면 이스케이프해야합니다!

function escapeSubstitute(s) {
    return s.replace(/\$/g, '$$$$');
}

(그 자체가 대체 문자열이기 때문에 4 $ s!)

이제 RegExp를 사용하여 전역 문자열 교체를 구현할 수 있습니다.

function replace_foo(target, string_to_replace, replacement) {
    var relit= escapeRegExp(string_to_replace);
    var sub= escapeSubstitute(replacement);
    var re= new RegExp(relit, 'g');
    return target.replace(re, sub);
}

얼마나 아팠는가. 다행히도 여러분이하고 싶은 것은 직선 문자열이 정규 표현식의 추가 부분으로 대체되지 않는다면 더 빠른 방법이 있습니다.

s.split(string_to_replace).join(replacement)

...그리고 그게 전부입니다. 이것은 일반적으로 이해되는 관용구입니다.

내가 string_to_replace를 제외한 모든 것을 바꾸려고한다고 말하자.

그게 무슨 뜻 이죠, 당신은 문자열에 대한 일치에 참여하지 않는 텍스트의 모든 뻗기를 대체하고 싶습니까? ^ 는 대체로 부정적인 의미가 아니므로 ^ 대체됩니다. ^[] 문자 그룹의 부정입니다. 부정적인 미리보기 (?!...) 도 있지만 JScript에서 문제가 있으므로 일반적으로 피해야합니다.

문자열에 '모든 것'을 매치하고 일치하는 문자열 사이에 빈 스트레치를 버리는 함수를 사용하는 것이 좋습니다.

var re= new RegExp('(.*)($|'+escapeRegExp(string_to_find)+')')
return target.replace(re, function(match) {
    return match[1]===''? match[2] : replacement+match[2];
});

여기에서 다시 한 번 분할이 더 간단 할 수 있습니다.

var parts= target.split(string_to_match);
for (var i= parts.length; i-->0;)
    if (parts[i]!=='')
        parts[i]= replacement;
return parts.join(string_to_match);


다른 사람들이 말했듯이 이것을하기 위해 new RegExp(pattern, flags) 를 사용하십시오. 문자열 생성자에 문자열 리터럴을 전달하므로 모든 백 슬래시를 이스케이프 처리해야합니다. 예를 들어 정규 표현식이 백 슬래시와 일치하도록하려면 new RegExp('\\\\') 사용해야하지만 정규 표현식은 /\\/ 필요가 있습니다. 사용 방법에 따라 적절한 사전 처리 (특수 문자 이스케이프 등)없이 해당 기능에 사용자 입력을 전달할 때주의해야합니다. 사용자가 예기치 않은 결과를 얻을 수 있습니다.


이것에 대한 간단한 해결책은 다음과 같습니다.

function replace(target, string_to_replace, replacement) {
  return target.split(string_to_replace).join(replacement);
}

Regexes 전혀 필요 없음

또한 현대 브라우저에서 가장 빠른 것 같습니다. https://jsperf.com/replace-vs-split-join-vs-replaceall





regex