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


107

정규식을 사용하여 값에 (변수) 태그추가하고 싶습니다 . 패턴은 PHP에서 잘 작동하지만 JavaScript로 구현하는 데 문제가 있습니다.

패턴은 다음과 같습니다 ( 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>"));

그러나 이것은 옳지 않은 것 같습니다. 나는 패턴과 그 패턴을 정확히 기록했습니다. 어떤 아이디어?


가요 value변수는?
Dogbert

답변:


184

문자열에서 정규식을 생성하려면 JavaScript의 RegExpobject 를 사용해야 합니다 .

두 번 이상 일치 / 교체 하려면 (global match) 플래그를 추가 해야합니다 . 예를 들면 다음과 같습니다.g

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.

여기에 JSFiddle 데모.


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

같은 일부 speciall의 문자가 :하지만 아니 모든 문자열은 유효한 정규식이며, ([. 이 문제를 해결하려면 정규식으로 바꾸기 전에 문자열을 이스케이프하면됩니다. 이를위한 유틸리티 함수는 아래 샘플에 있습니다.

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.

여기에 JSFiddle 데모.



참고 : 문제의 정규식은 사용 s질문의 시간에 존재하지 않는 수정을, 하지만 존재를 않습니다 - s( DOTALL ) 플래그 / 수정을 자바 스크립트에 - 오늘 .


2
이것은 훌륭하고 내가 지금까지 정규식에서 동적 변수를 사용하면서 찾은 최고의 예입니다. 감사합니다!
Eolis 2015-07-28

1
2019의 경우 s 수정자가 있습니다. 답변의 MDN 링크를 다시 참조하십시오.
Nickensoul 19

트윗 담아 가기 알림 주셔서 감사합니다!
acdcjunior 19

let idr = new RegExp (변수 + "$"); Table.find ({field : new RegExp (idr, 'i')}) 나는 이것을 좋아했습니다. 건배.
Utkarsh

14

식에서 변수 값을 사용하려는 경우 RegExp "생성자"를 사용해야합니다.

var regex="(?!(?:[^<]+>|[^>]+<\/a>))\b(" + value + ")\b";
new RegExp(regex, "is")

6

"정규식을 정의 할 필요가 없습니다 .

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같은 정규 표현식 문자를 포함 (, [그리고 ?당신이 그들을 탈출해야합니다.


2
첫 번째 옵션 것없는 작업 문자열 "값"을 찾고하지 않는 한
mothmonsterman

@happytimeharry 그가 게시 한 두 정규식간에 충돌이있는 것 같습니다.
Halcyon 2013

@Fritz 밴 Campen는 자신의 자바 스크립트의 예를 주어, 패턴의 의도는, 변수 사용하는 것을 보인다
mothmonsterman

여기에 같은 문제는 "입니다"플래그 뭔가 잘못된 것 같다 "catch되지 않은 구문 에러 : 정규식 생성자에 공급 잘못된 플래그가 '있다'"
Borstenhorst

RegExp의 생성자에 대한 플래그를 분리해야합니다. 그러나 여전히 정규식은 작동하지 않습니다.
Borstenhorst 2013

5

이 스레드가 유용하다는 것을 알았으므로 내 문제에 대한 답을 추가 할 것이라고 생각했습니다.

나는 자바 스크립트의 노드 응용 프로그램에서 데이터베이스 구성 파일 (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

4

나는 그것을 작동시키기 위해 \ b를 더블 슬래시해야한다는 것을 알았다. 예를 들어, 변수를 사용하여 문자열에서 "1x"단어를 제거하려면 다음을 사용해야합니다.

    str = "1x";
    var regex = new RegExp("\\b"+str+"\\b","g"); // same as inv.replace(/\b1x\b/g, "")
    inv=inv.replace(regex, "");

나를 위해 일했습니다. 감사합니다.
Pravin Bhapkar

1

훨씬 쉬운 방법 : 템플릿 리터럴을 사용합니다.

var variable = 'foo'
var expression = `.*${variable}.*`
var re = new RegExp(expression, 'g')
re.test('fdjklsffoodjkslfd') // true
re.test('fdjklsfdjkslfd') // false

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

도움이 되었기를 바랍니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.