JavaScript에서 동적(변수) 문자열을 정규식 패턴으로 사용
regex가 있는 값에 (변수) 태그를 추가하고 싶습니다. 패턴은 PHP와 잘 작동하지만 자바스크립트로 구현하는 데 문제가 있습니다.
으)입니다.value
변수임):
/(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is
저는 백슬래시를 피했습니다.
var str = $("#div").html();
var regex = "/(?!(?:[^<]+>|[^>]+<\\/a>))\\b(" + value + ")\\b/is";
$("#div").html(str.replace(regex, "<a href='#" + value +">" + value + "</a>"));
하지만 이것은 옳지 않은 것 같습니다, 저는 패턴을 기록했고 그것이 정확히 무엇이어야 하는지를 기록했습니다.아이디어 있어요?
문자열에서 정규식을 만들려면 JavaScript의 개체를 사용해야 합니다.
두 번 이상 일치/바꾸려면 (글로벌 일치) 플래그를 추가해야 합니다.다음은 예입니다.
var stringToGoIntoTheRegex = "abc";
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g");
// at this point, the line above is the same as: var regex = /#abc#/g;
var input = "Hello this is #abc# some #abc# stuff.";
var output = input.replace(regex, "!!");
alert(output); // Hello this is !! some !! stuff.
일반적인 경우 정규식으로 사용하기 전에 문자열을 이스케이프합니다.
정규식은 " 나모든유아정다닙니규은식효한문이그자열러다아ers닙니,▁▁like▁is"와 같은 특수 . 다음과 같은 특수 문자가 있습니다.(
또는[
이 문제를 해결하려면 문자열을 정규식으로 바꾸기 전에 이스케이프하기만 하면 됩니다.이에 대한 유틸리티 기능은 아래 샘플에 있습니다.
function escapeRegExp(stringToGoIntoTheRegex) {
return stringToGoIntoTheRegex.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
}
var stringToGoIntoTheRegex = escapeRegExp("abc"); // this is the only change from above
var regex = new RegExp("#" + stringToGoIntoTheRegex + "#", "g");
// at this point, the line above is the same as: var regex = /#abc#/g;
var input = "Hello this is #abc# some #abc# stuff.";
var output = input.replace(regex, "!!");
alert(output); // Hello this is !! some !! stuff.
은 ": 질의정은다사음을용다니합규식참고"를 사용합니다.s
질문 당시에는 존재하지 않았지만 현재는 존재하는 수식어(JavaScript의 (도탈) 플래그/수정어)입니다.
식에 변수 값을 사용하려면 RegExp "생성자"를 사용해야 합니다.
var regex = "(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b";
new RegExp(regex, "is")
작동하려면 \b를 두 배로 잘라야 한다는 것을 알게 되었습니다.예를 들어 변수를 사용하여 문자열에서 "1x" 단어를 제거하려면 다음을 사용해야 했습니다.
str = "1x";
var regex = new RegExp("\\b"+str+"\\b","g"); // same as inv.replace(/\b1x\b/g, "")
inv=inv.replace(regex, "");
당신은 그것이 필요하지 않습니다."
정규식을 정의하려면 다음과 같이 하십시오.
var regex = /(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/is; // this is valid syntax
한다면value
는 변수이며 동적 정규식을 원하는 경우 이 표기법을 사용할 수 없습니다. 대체 표기법을 사용하십시오.
String.replace
또한 문자열을 입력으로 수락하므로 다음 작업을 수행할 수 있습니다."fox".replace("fox", "bear");
대안:
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(value)\b/", "is");
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b/", "is");
var regex = new RegExp("/(?!(?:[^<]+>|[^>]+<\/a>))\b(.*?)\b/", "is");
만에약라면 하세요.value
에는 다과같은정표문현자포있습다니함어되식과 같은 문자가 되어 있습니다.(
,[
그리고.?
당신은 그들에게서 탈출해야 할 것입니다.
저는 이 스레드가 유용하다는 것을 알게 되었습니다. 그래서 저는 제 문제에 답을 추가하려고 생각했습니다.
자바스크립트로 노드 애플리케이션에서 데이터베이스 구성 파일(datastax cassandra)을 편집하고 문자열에 일치해야 하는 파일의 설정 중 하나에 대해 편집한 다음 줄을 바꾸고 싶었습니다.
이것이 제 해결책이었습니다.
dse_cassandra_yaml='/etc/dse/cassandra/cassandra.yaml'
// a) find the searchString and grab all text on the following line to it
// b) replace all next line text with a newString supplied to function
// note - leaves searchString text untouched
function replaceStringNextLine(file, searchString, newString) {
fs.readFile(file, 'utf-8', function(err, data){
if (err) throw err;
// need to use double escape '\\' when putting regex in strings !
var re = "\\s+(\\-\\s(.*)?)(?:\\s|$)";
var myRegExp = new RegExp(searchString + re, "g");
var match = myRegExp.exec(data);
var replaceThis = match[1];
var writeString = data.replace(replaceThis, newString);
fs.writeFile(file, writeString, 'utf-8', function (err) {
if (err) throw err;
console.log(file + ' updated');
});
});
}
searchString = "data_file_directories:"
newString = "- /mnt/cassandra/data"
replaceStringNextLine(dse_cassandra_yaml, searchString, newString );
실행 후 기존 데이터 디렉토리 설정이 새 설정으로 변경됩니다.
구성 파일 이전:
data_file_directories:
- /var/lib/cassandra/data
구성 파일 다음:
data_file_directories:
- /mnt/cassandra/data
훨씬 쉬운 방법: 템플릿 리터럴을 사용합니다.
var variable = 'foo'
var expression = `.*${variable}.*`
var re = new RegExp(expression, 'g')
re.test('fdjklsffoodjkslfd') // true
re.test('fdjklsfdjkslfd') // false
문자열 변수 내용을 보다 복잡한 합성 정규식의 일부로 사용(es6|ts)
이 예제는 다음을 사용하여 모든 URL을 바꿉니다.my-domain.com
로.my-other-domain
(둘 다 변수입니다.)
원시 문자열 템플릿 내에서 문자열 값과 다른 정규식을 결합하여 동적 정규식을 수행할 수 있습니다.사용.String.raw
Javascript를 사용하면 문자열 값 내의 문자를 이스케이프할 수 없습니다.
// Strings with some data
const domainStr = 'my-domain.com'
const newDomain = 'my-other-domain.com'
// Make sure your string is regex friendly
// This will replace dots for '\'.
const regexUrl = /\./gm;
const substr = `\\\.`;
const domain = domainStr.replace(regexUrl, substr);
// domain is a regex friendly string: 'my-domain\.com'
console.log('Regex expresion for domain', domain)
// HERE!!! You can 'assemble a complex regex using string pieces.
const re = new RegExp( String.raw `([\'|\"]https:\/\/)(${domain})(\S+[\'|\"])`, 'gm');
// now I'll use the regex expression groups to replace the domain
const domainSubst = `$1${newDomain}$3`;
// const page contains all the html text
const result = page.replace(re, domainSubst);
참고: regex101.com 을 사용하여 REGEX 코드를 만들고 테스트하고 내보내는 것을 잊지 마십시오.
var string = "Hi welcome to stack overflow"
var toSearch = "stack"
//case insensitive search
var result = string.search(new RegExp(toSearch, "i")) > 0 ? 'Matched' : 'notMatched'
https://jsfiddle.net/9f0mb6Lz/
이것이 도움이 되길 바랍니다.
언급URL : https://stackoverflow.com/questions/17885855/use-dynamic-variable-string-as-regex-pattern-in-javascript
'programing' 카테고리의 다른 글
if 문 정수 (0) | 2023.07.25 |
---|---|
이 작업을 수행하려면 ORA-02069 global_names 매개 변수를 TRUE로 설정해야 합니다. (0) | 2023.07.25 |
동일 원산지 정책 - AJAX & 공용 API 사용 (0) | 2023.07.25 |
장고: 테이블이 존재하지 않습니다. (0) | 2023.07.25 |
대규모 프로젝트를 위한 PHP가 없습니까?왜 안 되나요? (0) | 2023.07.25 |