Javascript Regex : 정규식 안에 변수를 넣는 방법?


206

예를 들어 :

function(input){
    var testVar = input;
    string = ...
    string.replace(/ReGeX + testVar + ReGeX/, "replacement")
}

그러나 이것은 물론 작동하지 않습니다 :) 이것을 할 수있는 방법이 있습니까?


11
사용자가이 변수를 제공하게하면 악의적 인 사용자가 치명적인 역 추적을 통해 응용 프로그램을 쉽게 중단시킬 수 있습니다.
Tim Pietzcker

2
"ReGeX"는 무엇입니까? 변수 이름입니까? 그것은 RegExp 구성의 일부라는 것을 암시하여 혼란스러워합니다 (독자가 질문에서 이상한 문자를 보지 못한 경우).
Eduard

답변:


272
const regex = new RegExp(`ReGeX${testVar}ReGeX`);
...
string.replace(regex, "replacement");

최신 정보

의견의 일부 당, 당신이 할 수 있음에 유의해야 탈출 변수 (예 : 변수가 사용자의 입력에서 오는) 악의적 인 콘텐츠에 대한 가능성이있는 경우

ES6 업데이트

2019 년에는 일반적으로 템플릿 문자열을 사용하여 작성되며 위 코드가 업데이트되었습니다. 원래 답변은 다음과 같습니다.

var regex = new RegExp("ReGeX" + testVar + "ReGeX");
...
string.replace(regex, "replacement");

5
줄을 피하십시오! @zzzzBov 답변보기
jtpereyda

이것은 당신이 모습을 가지고하시기 바랍니다 수 있습니다, 내 경우에는 작동하지 않습니다 이 jsfiddle을 알려 주시기 바랍니다 만약 내가로 국가 코드 동적 설정하려면 무엇을해야 regex표현
Kirankumar Dafda

10
기억해야 할 한 가지 중요한 점은 정규 문자열에서 \ 문자는 이스케이프해야하고 정규 표현식 리터럴에서는 일반적으로 / 문자를 이스케이프해야한다는 것입니다. 그래서 /\w+\//i이된다new RegExp("\\w+/", "i")
알리

3
/ g는 어떻습니까?
Qian Chen

여러분,이 정규식 /[^0-9.-]/g를 두 부분으로 나눌 필요가 있습니다 : / [^ 0-9와-] / g 어떻게해야합니까?
최대

79

RegExp 객체를 사용할 수 있습니다.

var regexstring = "whatever";
var regexp = new RegExp(regexstring, "gi");
var str = "whateverTest";
var str2 = str.replace(regexp, "other");
document.write(str2);

그런 다음 regexstring원하는 방식으로 구성 할 수 있습니다 .

자세한 내용은 여기를 참조 하십시오 .


var characterCount = parseInt (attrs.limitCharacterCount); console.log (characterCount); var specialCharactersValidation = 새로운 RegExp ( "/ ^ [a-zA-Z0-9] {"+ characterCount + "} $ /"); / \ / ^ [a-zA-Z0-9] {7} $ \ // requestShipmentDirectives.js : 76 false main.js : 46 잡히지 않은 TypeError : null의 'offsetWidth'속성을 읽을 수 없습니다. RegEx Dynamic.
Ankit Tanna

31

JavaScript의 변수에서 정규식을 작성하려면 RegExp문자열 매개 변수와 함께 생성자 를 사용해야합니다 .

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}

물론 이것은 매우 순진한 예입니다. input정규 표현식에 대해 올바르게 이스케이프되었다고 가정합니다 . 사용자 입력을 다루거나 특수 문자를보다 편리하게 일치 시키려면 특수 문자를 이스케이프 처리 해야합니다 .

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

function reg(input) {
    var flags;
    //could be any combination of 'g', 'i', and 'm'
    flags = 'g';
    input = regexEscape(input);
    return new RegExp('ReGeX' + input + 'ReGeX', flags);
}

이것이 나를 위해 일한 유일한 방법은 ReGeX텍스트를 삭제하는 것입니다. return new RegExp(input, flags);
Michael Rader

2
@MichaelRader, 그렇습니다. "ReGeX"텍스트는 문제의 일부였으며 코드 작동에 필요한 것이 아니라 예제로 사용되었습니다.
zzzzBov

1
lol은 단지 당신의 자리 표시 자라는 것을 깨달았습니다. 감사.
Michael Rader

문자열을 이스케이프 해야하는 이유를 이해합니다. 그러나 '\\ $ &'가 대체품으로 사용되는 이유
Sherin Binu

2
\\은 단일 \문자를 나타내며 $&일치하는 하위 문자열 입니다.
zzzzBov

7

es6 템플릿 리터럴 을 사용하는 경우 옵션입니다 ...

string.replace(new RegExp(`ReGeX${testVar}ReGeX`), "replacement")

템플릿 리터럴에서는 작동하지 않습니다. 내 응용 프로그램에서 암호를 확인하기 위해 regexp를 사용하고 있으며 정규 표현식 문자열에서 최대 길이와 최소 길이를 매개 변수화하려고했지만 작동하지 않습니다. ```const newRegExp = 새로운 RegExp ( ^[^\s]{${4},${32}}$); 내보내기 const validatePassword = 값 => value.match (newRegExp); ```
p7adams

6

항상 정규 표현식을 문자열로 제공 할 수 있습니다 (예 :) "ReGeX" + testVar + "ReGeX". 문자열 내에서 일부 문자 (예 : 큰 따옴표)를 이스케이프해야 할 수도 있지만 대부분의 경우 동일합니다.

RegExp생성자를 사용 하여 플래그를 전달할 수도 있습니다 ( docs 참조 ).


3

다음 두 가지 방법 중 하나로 JS에서 정규 표현식을 작성할 수 있습니다.

  1. 정규 표현식 리터럴 사용- /ab{2}/g
  2. 정규식 생성자 사용- new RegExp("ab{2}", "g").

정규식 리터럴은 상수이며 변수와 함께 사용할 수 없습니다. 이것은 생성자를 사용하여 달성 할 수 있습니다. RegEx 생성자의 구조는 다음과 같습니다.

new RegExp(regularExpressionString, modifiersString)

regularExpressionString의 일부로 변수를 포함 할 수 있습니다. 예를 들어

var pattern="cd"
var repeats=3
new RegExp(`${pattern}{${repeats}}`, "g") 

이것은 패턴의 모양과 일치합니다 cdcdcd.


2

다음은 특정 문자로 래핑 된 값을 반환하는 매우 쓸모없는 함수입니다. :)

jsfiddle : https://jsfiddle.net/squadjot/43agwo6x/

function getValsWrappedIn(str,c1,c2){
    var rg = new RegExp("(?<=\\"+c1+")(.*?)(?=\\"+c2+")","g"); 
    return str.match(rg);
    }

var exampleStr = "Something (5) or some time (19) or maybe a (thingy)";
var results =  getValsWrappedIn(exampleStr,"(",")")

// Will return array ["5","19","thingy"]
console.log(results)

2

허용 된 답변이 저에게 효과가 없으며 MDN 예를 따르지 않습니다.

위 링크의 '설명'섹션 참조

나는 그것이 나를 위해 일하고있는 다음과 함께 갈 것이다.

let stringThatIsGoingToChange = 'findMe';
let flagsYouWant = 'gi' //simple string with flags
let dynamicRegExp = new RegExp(`${stringThatIsGoingToChange}`, flagsYouWant)

// that makes dynamicRegExp = /findMe/gi

1
여전히 작동합니다. 문제는 'ReGeX'+ testVar + 'ReGeX'가 솔루션을 혼란스럽게 만든다는 것입니다. 실제로 예제를 추가하면 내 의견으로는 문제가 해결됩니다. var testVar = '321'; var regex = new RegExp ( "["+ testVar + "] {2}", "g"); // / [321] {2} / g와 동일
HelloWorldPeace

1

문자열 변수를 먼저 준비한 다음 RegEx로 변환하기 만하면됩니다.

예를 들면 다음과 같습니다.

RegEx에 변수 를 추가 minLength하고 싶습니다 MaxLength.

function getRegEx() {
    const minLength = "5"; // for exapmle: min is 5
    const maxLength = "12"; // for exapmle: man is 12

    var regEx = "^.{" + minLength + ","+ maxLength +"}$"; // first we make a String variable of our RegEx
    regEx = new RegExp(regEx, "g"); // now we convert it to RegEx

    return regEx; // In the end, we return the RegEx
}

MaxLength또는의 값을 변경하면 MinLength모든 RegEx에서 변경됩니다.

도움이 되길 바랍니다. 내 영어에 대해 죄송합니다.

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