programing

JavaScript에서 동적(변수) 문자열을 정규식 패턴으로 사용

i4 2023. 7. 25. 20:27
반응형

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.

JS Fiddle 데모입니다.


일반적인 경우 정규식으로 사용하기 전에 문자열을 이스케이프합니다.

정규식은 " 나모든유아정다닙니규은식효한문이그자열러다아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.

JS Fiddle 데모입니다.



은 ": 질의정은다사음을용다니합규식참고"를 사용합니다.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.rawJavascript를 사용하면 문자열 값 내의 문자를 이스케이프할 수 없습니다.

// 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

반응형