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);
그래 넌 할수있어.
https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions
function replace_foo(target, string_to_replace, replacement) {
var regex = new RegExp("^" + string_to_replace);
return target.replace(regex, replacement);
}
다른 사람들이 말했듯이 이것을하기 위해 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