Aș dori pentru a crea un Șir de caractere.toții () metoda în JavaScript și am'm gândesc că, folosind un regex ar fi cel mai concis mod de a face asta. Cu toate acestea, pot't ne dăm seama cum să treacă o variabilă într-un regex. Pot face asta deja care va înlocui toate instanțele de"B" cu"O"`.
"ABABAB".replace(/B/g, "A");
Dar vreau să fac ceva de genul asta:
String.prototype.replaceAll = function(replaceThis, withThis) {
this.replace(/replaceThis/g, withThis);
};
Dar, evident, acest lucru nu va înlocui textul "replaceThis"
...deci, cum pot trece de această variabilă în a-mi string regex?
În loc de a folosi /regex/g
sintaxa, puteți construi o nou RegExp obiect:
var replace = "regex";
var re = new RegExp(replace,"g");
Puteți crea dinamic regex obiecte de acest fel. Atunci va face:
"mystring".replace(re, "newstring");
Ca Eric Wendelin menționat, puteți face ceva de genul asta:
str1 = "pattern"
var re = new RegExp(str1, "g");
"pattern matching .".replace(re, "regex");
Acest lucru dă "regex potrivire ."
. Cu toate acestea, acesta va eșua în cazul în str1 este "."
. Te'd asteptam ca rezultatul sa fie"model de potrivire regex", înlocuirea perioada cu
"regex", dar'll se dovedesc a fi...
regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex
Asta pentru că, deși `"." este un Șir de caractere, în constructorul RegExp-l's încă interpretată ca o expresie regulată, adică orice non-line-break caracter, adica fiecare caracter din șir. În acest scop, următoarele funcții pot fi utile:
RegExp.quote = function(str) {
return str.replace(/([.?*+^$[\]\\(){}|-])/g, "\\$1");
};
Apoi, puteți face:
str1 = "."
var re = new RegExp(RegExp.quote(str1), "g");
"pattern matching .".replace(re, "regex");
obținându - "model de potrivire regex"
.
"ABABAB".replace(/B/g, "O");
Ca întotdeauna: don't folosi regex decât dacă trebuie. Pentru un șir simplu înlocui, de expresie este:
'ABABAB'.split('B').join('A')
Apoi don't trebuie să vă faceți griji cu referire la aspectele menționate în Gracenotes's a răspunde.
Asta:
var txt=new RegExp(pattern,attributes);
este echivalent cu acesta:
var txt=/pattern/attributes;
A se vedea http://www.w3schools.com/jsref/jsref_obj_regexp.asp.
Dacă doriți să obțineți TOATE aparițiile ("g"), fie cazul insensibil ("eu"), și de a folosi limite, astfel încât nu este't un cuvânt într-un alt cuvânt (\\b
):
re = new RegExp(`\\b${replaceThis}\\b`, 'gi');
Exemplu:
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.
Doriți să construiască expresia regulată în mod dinamic și pentru buna solutuion este de a utiliza new RegExp(string)
constructor. În scopul de constructor pentru a trata caracterele speciale la propriu, trebuie să scape de ele. Există o funcție de built-in în UI jQuery autocomplete widget numit $.ui.completare automată.escapeRegex
:
[...] puteți utiliza built-in
$.ui.completare automată.escapeRegex funcția. L'll ia un singur șir argument și de a scăpa de toate regex caractere, ceea ce face rezultatul în condiții de siguranță pentru a trece la
new RegExp()`.
Dacă sunteți folosind jQuery UI puteți folosi această funcție, sau copia acestuia definiție de la sursa:
function escapeRegex( value ) {
return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
}
Și de a folosi astfel:
"[z-a][z-a][z-a]".replace(new RegExp(escapeRegex("[z-a]"), "g"), "[a-z]");
// escapeRegex("[z-a]") -> "\[z\-a\]"
// new RegExp(escapeRegex("[z-a]"), "g") -> /\[z\-a\]/g
// end result -> "[a-z][a-z][a-z]"
String.prototype.replaceAll = function(a, b) {
return this.replace(new RegExp(a.replace(/([.?*+^$[\]\\(){}|-])/ig, "\\$1"), 'ig'), b)
}
Testați-l, cum ar fi:
var whatever = 'Some [b]random[/b] text in a [b]sentence.[/b]'
console.log(whatever.replaceAll("[", "<").replaceAll("]", ">"))
Aici's un alt toții de implementare:
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;
};
Și coffeescript versiune de Steven Penny's a răspunde, deoarece aceasta este #2 google rezultat....chiar dacă cafeaua este doar javascript cu o mulțime de personaje eliminat...;)
baz = "foo"
filter = new RegExp(baz + "d")
"food fight".match(filter)[0] // food
și în cazul meu particular
robot.name=hubot
filter = new RegExp(robot.name)
if msg.match.input.match(filter)
console.log "True!"
Pentru a satisface nevoia mea de a introduce o variabilă/alias/funcția într-o Expresie Regulată, acest lucru este ceea ce am venit cu:
oldre = /xx\(""\)/;
function newre(e){
return RegExp(e.toString().replace(/\//g,"").replace(/xx/g, yy), "g")
};
String.prototype.replaceAll = this.replace(newre(oldre), "withThis");
de unde 'oldre' este original regexp că vreau pentru a introduce o variabilă, 'xx' este substituent pentru care variabila/alias/funcția, si 'yy' este o variabilă reală nume, porecla, sau funcție.
În timp ce puteți face în mod dinamic-creat RegExp's (ca pe alte răspunsuri la această întrebare), am'll echo comentariul meu de la un post similar: La forma funcțională a Șir de caractere.replace() este extrem de util și, în multe cazuri, reduce nevoia de dinamic creat RegExp obiecte. (care sunt un fel de durere 'că trebuie să-și exprime intrare la constructorul RegExp ca un șir de caractere, mai degrabă decât de a folosi slash-uri /[A-Z]+/ regexp literal format)
Îl poți folosi întotdeauna indexOf
în mod repetat:
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);
};
Acest lucru nu merge într-o buclă infinită când înlocuirea conține meci.
Solutia ta este aici:
Treacă o variabilă pentru expresia regulată.
Cel pe care l-am implementat este de a lua o valoare dintr-un câmp de text care doriți să-l înlocuiți și alta este "înlocui cu" câmp de text, obtinerea de valoare din text-field într-o variabilă și setare variabila a RegExp funcție să mai înlocuiască. În cazul meu, eu sunt, folosind Jquery, de asemenea, puteți face cu doar JavaScript prea.
Codul 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));
});
Acest cod este pe Onclick eveniment a unui buton, puteți pune acest lucru într-o funcție pentru a apela.
Deci, acum puteți trece variabilă în a înlocui funcția.
Nici unul dintre aceste răspunsuri au fost clar pentru mine. În cele din urmă am găsit o explicație bună la http://burnignorance.com/php-programming-tips/how-to-use-a-variable-in-replace-function-of-javascript/
Răspunsul simplu este:
var search_term = new RegExp(search_term, "g");
text = text.replace(search_term, replace_term);
De exemplu:
$("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>