etc./StackOverFlow

정규식에서 변수를 어떻게 사용합니까?

청렴결백한 만능 재주꾼 2022. 1. 22. 07:11
반응형

질문자 :JC Grubbs


String.replaceAll() 메서드를 만들고 싶습니다. 정규식을 사용하는 것이 가장 간결한 방법이라고 생각합니다. 그러나 정규식에 변수를 전달하는 방법을 알 수 없습니다. 나는의 모든 인스턴스 교체 할 이미이 작업을 수행 할 수 있습니다 "B""A" .

 "ABABAB".replace(/B/g, "A");

하지만 다음과 같이 하고 싶습니다.

 String.prototype.replaceAll = function(replaceThis, withThis) { this.replace(/replaceThis/g, withThis); };

"replaceThis" 라는 텍스트만 대체할 것입니다. 그래서 이 변수를 정규식 문자열에 어떻게 전달합니까?



/regex\d/g 구문을 사용하는 대신 새 RegExp 객체를 생성할 수 있습니다.

 var replace = "regex\\d"; var re = new RegExp(replace,"g");

이 방법으로 정규식 개체를 동적으로 만들 수 있습니다. 그러면 다음을 수행할 것입니다.

 "mystring1".replace(re, "newstring");

Eric Wendelin

Eric Wendelin이 언급했듯이 다음과 같이 할 수 있습니다.

 str1 = "pattern" var re = new RegExp(str1, "g"); "pattern matching .".replace(re, "regex");

이렇게 하면 "regex matching ." . 그러나 str1이 "." . "pattern matching regex" 가 될 것으로 예상하고 마침표를 "regex" 바꾸지만 결과는 ...

 regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

비록 "." 는 문자열이고 RegExp 생성자에서 여전히 정규식으로 해석되며, 이는 문자열의 모든 문자를 의미하는 줄 바꿈이 아닌 모든 문자를 의미합니다. 이를 위해 다음 기능이 유용할 수 있습니다.

 RegExp.quote = function(str) { return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1"); };

그런 다음 다음을 수행할 수 있습니다.

 str1 = "." var re = new RegExp(RegExp.quote(str1), "g"); "pattern matching .".replace(re, "regex");

"pattern matching regex" 합니다.


Gracenotes

"ABABAB".replace(/B/g, "A");

항상 그렇듯이 꼭 필요한 경우가 아니면 정규식을 사용하지 마십시오. 간단한 문자열 교체의 경우 관용구는 다음과 같습니다.

 'ABABAB'.split('B').join('A')

그러면 Gracenotes의 답변에 언급된 인용 문제에 대해 걱정할 필요가 없습니다.


bobince

모든 항목( g )을 얻으려면 대소문자를 구분하지 않고( i ) 경계를 사용하여 다른 단어( \\b ) 내의 단어가 되지 않도록 합니다.

 re = new RegExp(`\\b${replaceThis}\\b`, 'gi');

예시:

 let inputString = "I'm John, or johnny, but I prefer john."; let replaceThis = "John"; let re = new RegExp(`\\b${replaceThis}\\b`, 'gi'); console.log(inputString.replace(re, "Jack")); // I'm Jack, or johnny, but I prefer Jack.

JBallin

match 메서드와 함께 변수를 사용하려는 사람은 다음과 같이 작업했습니다.

 var alpha = 'fig'; 'food fight'.match(alpha + 'ht')[0]; // fight

Steven Penny

이것:

 var txt=new RegExp(pattern,attributes);

다음과 같습니다.

 var txt=/pattern/attributes;

http://www.w3schools.com/jsref/jsref_obj_regexp.asp 를 참조하십시오.


Paige Ruten

this.replace( new RegExp( replaceThis, 'g' ), withThis );

tvanfosson

정규식을 동적으로 작성하려고 하며 이에 대한 적절한 솔루션은 new RegExp(string) 생성자를 사용하는 것입니다. 생성자가 특수 문자를 문자 그대로 처리하려면 특수 문자를 이스케이프해야 합니다. $.ui.autocomplete.escapeRegex 라는 jQuery UI 자동 완성 위젯 에 내장 함수가 있습니다.

[...] 내장된 $.ui.autocomplete.escapeRegex 함수를 사용할 수 있습니다. 단일 문자열 인수를 사용하고 모든 정규식 문자를 이스케이프하여 결과를 new RegExp() 안전하게 전달할 수 있습니다.

jQuery UI 를 사용하는 경우 해당 함수를 사용하거나 소스에서 해당 정의를 복사할 수 있습니다.

 function escapeRegex( value ) { return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ); }

그리고 다음과 같이 사용하십시오.

 "[za][za][za]".replace(new RegExp(escapeRegex("[za]"), "g"), "[az]"); // escapeRegex("[za]") -> "\[z\-a\]" // new RegExp(escapeRegex("[za]"), "g") -> /\[z\-a\]/g // end result -> "[az][az][az]"

Salman A

String.prototype.replaceAll = function (replaceThis, withThis) { var re = new RegExp(replaceThis,"g"); return this.replace(re, withThis); }; var aa = "abab54..aba".replaceAll("\\.", "v");

도구로 테스트


unigogo

String.prototype.replaceAll = function(a, b) { return this.replace(new RegExp(a.replace(/([.?*+^$[\]\\(){}|-])/ig, "\\$1"), 'ig'), b) }

다음과 같이 테스트하십시오.

 var whatever = 'Some [b]random[/b] text in a [b]sentence.[/b]' console.log(whatever.replaceAll("[", "<").replaceAll("]", ">"))

MetalGodwin

정규 표현식에 변수/별칭/함수를 삽입해야 하는 필요성을 충족하기 위해 다음과 같이 생각해 냈습니다.

 oldre = /xx\(""\)/; function newre(e){ return RegExp(e.toString().replace(/\//g,"").replace(/xx/g, yy), "g") }; String.prototype.replaceAll = this.replace(newre(oldre), "withThis");

여기서 'oldre'는 변수를 삽입하려는 원래 정규식이고 'xx'는 해당 변수/별칭/함수의 자리 표시자이며 'yy'는 실제 변수 이름, 별칭 또는 함수입니다.


Alex Li

문자열을 정규식으로 사용할 수 있습니다. 새 RegExp 를 사용하는 것을 잊지 마십시오.

예시:

 var yourFunction = new RegExp( '^-?\\d+(?:\\.\\d{0,' + yourVar + '})?' )

user7396942

그리고 Steven Penny의 답변 의 CoffeeScript 버전 , 이것은 #2 Google 결과이기 때문에.... CoffeeScript가 많은 문자가 제거된 JavaScript일지라도...;)

 baz = "foo" filter = new RegExp(baz + "d") "food fight".match(filter)[0] // food

그리고 내 특별한 경우 :

 robot.name = hubot filter = new RegExp(robot.name) if msg.match.input.match(filter) console.log "True!"

keen

다음은 또 다른 replaceAll 구현입니다.

 String.prototype.replaceAll = function (stringToFind, stringToReplace) { if ( stringToFind == stringToReplace) return this; var temp = this; var index = temp.indexOf(stringToFind); while (index != -1) { temp = temp.replace(stringToFind, stringToReplace); index = temp.indexOf(stringToFind); } return temp; };

scripto

동적으로 생성된 RegExp(이 질문에 대한 다른 응답에 따라)를 만들 수 있지만 비슷한 게시물 에서 내 의견을 반영하겠습니다. String.replace() 의 기능적 형식은 매우 유용하며 많은 경우에 동적으로 생성된 RegExp 개체. (슬래시 /[AZ]+/ regexp 리터럴 형식을 사용하는 대신 RegExp 생성자에 대한 입력을 문자열로 표현해야 하기 때문에 일종의 고통입니다)


Jason S

이 자체 호출 함수는 인덱스를 사용하여 replacerItems를 반복하고 각 패스와 함께 문자열에서 replacerItems[index]를 전역적으로 변경합니다.

 const replacerItems = ["a", "b", "c"]; function replacer(str, index){ const item = replacerItems[index]; const regex = new RegExp(`[${item}]`, "g"); const newStr = str.replace(regex, "z"); if (index < replacerItems.length - 1) { return replacer(newStr, index + 1); } return newStr; } // console.log(replacer('abcdefg', 0)) will output 'zzzdefg'

user8094098

$1 이 작동하지 않는 경우 다음을 사용할 수 있습니다.

 var pattern = new RegExp("amman", "i"); "abc Amman efg".replace(pattern, "<b>" + "abc Amman efg".match(pattern)[0] + "</b>");

Fareed Alnamrouti

indexOf 반복적으로 사용할 수 있습니다.

 String.prototype.replaceAll = function(substring, replacement) { var result = ''; var lastIndex = 0; while(true) { var index = this.indexOf(substring, lastIndex); if(index === -1) break; result += this.substring(lastIndex, index) + replacement; lastIndex = index + substring.length; } return result + this.substring(lastIndex); };

교체에 일치 항목이 포함되어 있으면 무한 루프에 들어가지 않습니다.


Ry-

이 대답들 중 어느 것도 나에게 명확하지 않았습니다. 결국 JavaScript의 대체 기능에서 변수를 사용하는 방법 에서 좋은 설명을 찾았습니다.

간단한 대답은 다음과 같습니다.

 var search_term = new RegExp(search_term, "g"); text = text.replace(search_term, replace_term);

예를 들어:

 $("button").click(function() { Find_and_replace("Lorem", "Chocolate"); Find_and_replace("ipsum", "ice-cream"); }); function Find_and_replace(search_term, replace_term) { text = $("textbox").html(); var search_term = new RegExp(search_term, "g"); text = text.replace(search_term, replace_term); $("textbox").html(text); }
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <textbox> Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum Lorem ipsum </textbox> <button>Click me</button>


Paul Chris Jones

솔루션은 다음과 같습니다.

정규 표현식에 변수 전달

내가 구현한 것은 바꾸려는 텍스트 필드에서 값을 가져오고 다른 하나는 "바꾸기" 텍스트 필드에서 값을 가져오고 변수의 텍스트 필드에서 값을 가져오고 변수를 RegExp로 설정하는 것입니다. 기능을 추가로 교체합니다. 제 경우에는 jQuery를 사용하고 있지만 JavaScript만으로 할 수도 있습니다.

자바스크립트 코드:

 var replace =document.getElementById("replace}"); // getting a value from a text field with I want to replace var replace_with = document.getElementById("with"); //Getting the value from another text fields with which I want to replace another string. var sRegExInput = new RegExp(replace, "g"); $("body").children().each(function() { $(this).html($(this).html().replace(sRegExInput,replace_with)); });

이 코드는 버튼의 Onclick 이벤트에 있으며 이것을 호출할 함수에 넣을 수 있습니다.

이제 replace 함수에서 변수를 전달할 수 있습니다.


Ajit Hogade

정규 표현식이 없는 다중 바꾸기의 경우 다음을 사용했습니다.

 let str = "I am a cat man. I like cats"; let find = "cat"; let replace = "dog"; // Count how many occurrences there are of the string to find // inside the str to be examined. let findCount = str.split(find).length - 1; let loopCount = 0; while (loopCount < findCount) { str = str.replace(find, replace); loopCount = loopCount + 1; } console.log(str); // I am a dog man. I like dogs

솔루션의 중요한 부분은 여기에서 찾았습니다.


John Shearing

올바른 구문으로 변수를 전달하면 아래 코드와 같이 이를 수행할 수 있습니다.

이는 동일한 변수에서 플래그를 사용하는 추가 이점이 있습니다.

\w 등의 경우 정규식에서 \ 를 이중 이스케이프할 필요가 없습니다.

 var str = 'regexVariable example: This is my example of RegExp replacing with a regexVariable.' var reVar = /(.*?)(regex\w+?iable)(.+?)/gi; var resStr = str.replace(new RegExp(reVar), '$1 :) :) :) $2 :) :) :)$3'); console.log(resStr); // Returns: // :) :) :) regexVariable :) :) :) example: This is my example of RegExp replacing with a :) :) :) regexVariable :) :) :).

OP의 예에 따른 프로토타입 버전:

 var str = 'regexVariable prototype: This is my example of RegExp replacing with a regexVariable.' String.prototype.regexVariable = function(reFind, reReplace) { return str.replace(new RegExp(reFind), reReplace); } var reVar = /(.*?)(regex\w+?iable)(.+?)/gi; console.log(str.regexVariable(reVar, '$1 :) :) :) $2 :) :) :)$3')); // Returns: // :) :) :) regexVariable :) :) :) prototype: This is my example of replacing with a :) :) :) regexVariable :) :) :).


Ste

상대적인 JavaScript 초보자로서 허용되는 답변 https://stackoverflow.com/a/494046/1904943 은 언급/감사하지만 매우 직관적이지 않습니다.

다음은 예를 통해 더 간단한 해석입니다( 간단한 JavaScript IDE 사용 ).

 myString = 'apple pie, banana loaf'; console.log(myString.replaceAll(/pie/gi, 'PIE')) // apple PIE, banana loaf console.log(myString.replaceAll(/\bpie\b/gi, 'PIE')) // apple PIE, banana loaf console.log(myString.replaceAll(/pi/gi, 'PIE')) // apple PIEe, banana loaf console.log(myString.replaceAll(/\bpi\b/gi, 'PIE')) // [NO EFFECT] apple pie, banana loaf const match_word = 'pie'; console.log(myString.replaceAll(/match_word/gi, '**PIE**')) // [NO EFFECT] apple pie, banana loaf console.log(myString.replaceAll(/\b`${bmatch_word}`\b/gi, '**PIE**')) // [NO EFFECT] apple pie, banana loaf // ---------------------------------------- // ... new RegExp(): be sure to \-escape your backslashes: \b >> \\b ... const match_term = 'pie'; const match_re = new RegExp(`(\\b${match_term}\\b)`, 'gi') console.log(myString.replaceAll(match_re, 'PiE')) // apple PiE, banana loaf console.log(myString.replace(match_re, '**PIE**')) // apple **PIE**, banana loaf console.log(myString.replaceAll(match_re, '**PIE**')) // apple **PIE**, banana loaf

애플리케이션

예: 문자열/문장에서 단어 교체(색상 강조 표시), 검색 용어가 일치하는 단어의 사용자 정의 비율 이상과 일치하는 경우 [선택 사항].

참고: 일치하는 용어의 원래 대소문자는 유지됩니다. hl : 하이라이트; re : 정규식 | 정규식

 mySentence = "Apple, boOk? BOoks; booKEd. BookMark, 'BookmarkeD', bOOkmarks! bookmakinG, Banana; bE, BeEn, beFore." function replacer(mySentence, hl_term, hl_re) { console.log('mySentence [raw]:', mySentence) console.log('hl_term:', hl_term, '| hl_term.length:', hl_term.length) cutoff = hl_term.length; console.log('cutoff:', cutoff) // `.match()` conveniently collects multiple matched items // (including partial matches) into an [array] const hl_terms = mySentence.toLowerCase().match(hl_re, hl_term); if (hl_terms == null) { console.log('No matches to hl_term "' + hl_term + '"; echoing input string then exiting ...') return mySentence; } console.log('hl_terms:', hl_terms) for (let i = 0; i < hl_terms.length; i++) { console.log('----------------------------------------') console.log('[' + i + ']:', hl_terms[i], '| length:', hl_terms[i].length, '| parseInt(0.7(length)):', parseInt(0.7*hl_terms[i].length)) // TEST: if (hl_terms[i].length >= cutoff*10) { if (cutoff >= parseInt(0.7 * hl_terms[i].length)) { var match_term = hl_terms[i].toString(); console.log('matched term:', match_term, '[cutoff length:', cutoff, '| 0.7(matched term length):', parseInt(0.7 * hl_terms[i].length)) const match_re = new RegExp(`(\\b${match_term}\\b)`, 'gi') mySentence = mySentence.replaceAll(match_re, '<font style="background:#ffe74e">$1</font>'); } else { var match_term = hl_terms[i].toString(); console.log('NO match:', match_term, '[cutoff length:', cutoff, '| 0.7(matched term length):', parseInt(0.7 * hl_terms[i].length)) } } return mySentence; } // TESTS: // const hl_term = 'be'; // const hl_term = 'bee'; // const hl_term = 'before'; // const hl_term = 'book'; const hl_term = 'bookma'; // const hl_term = 'Leibniz'; // This regex matches from start of word: const hl_re = new RegExp(`(\\b${hl_term}[Az]*)\\b`, 'gi') mySentence = replacer(mySentence, hl_term, hl_re); console.log('mySentence [processed]:', mySentence)

산출

 mySentence [raw]: Apple, boOk? BOoks; booKEd. BookMark, 'BookmarkeD', bOOkmarks! bookmakinG, Banana; bE, BeEn, beFore. hl_term: bookma | hl_term.length: 6 cutoff: 6 hl_terms: Array(4) [ "bookmark", "bookmarked", "bookmarks", "bookmaking" ] ---------------------------------------- [0]: bookmark | length: 8 | parseInt(0.7(length)): 5 matched term: bookmark [cutoff length: 6 | 0.7(matched term length): 5 ---------------------------------------- [1]: bookmarked | length: 10 | parseInt(0.7(length)): 7 NO match: bookmarked [cutoff length: 6 | 0.7(matched term length): 7 ---------------------------------------- [2]: bookmarks | length: 9 | parseInt(0.7(length)): 6 matched term: bookmarks [cutoff length: 6 | 0.7(matched term length): 6 ---------------------------------------- [3]: bookmaking | length: 10 | parseInt(0.7(length)): 7 NO match: bookmaking [cutoff length: 6 | 0.7(matched term length): 7 mySentence [processed]: Apple, boOk? BOoks; booKEd. <font style="background:#ffe74e">BookMark</font>, 'BookmarkeD', <font style="background:#ffe74e">bOOkmarks</font>! bookmakinG, Banana; bE, BeEn, beFore.

Victoria Stuart

출처 : http:www.stackoverflow.com/questions/494035/how-do-you-use-a-variable-in-a-regular-expression

반응형