Kaip pakeisti visus eilutės įvykius javascript'e

Turiu šią eilutę:

 "Test abc test test abc test test test abc test test abc" 

Vykdymas

 str = str.replace('abc', ''); 

atrodo, kad pirmoje eilutėje pašalinamas tik pirmasis abc įvykis. Kaip pakeisti visą jo išvaizdą?

3522
17 июля '09 в 20:53 2009-07-17 20:53 Spauskite „Upvote “ nustatoma liepos 17 d., 09:53, 2009-07-17 20:53
@ 46 atsakymai
  • 1
  • 2

Dėl išsamumo aš galvojau apie tai, kokį metodą turėčiau naudoti. Iš esmės yra du būdai tai padaryti, kaip siūlo kiti šio puslapio atsakymai.

Pastaba: Paprastai įterptųjų prototipų išplėtimas „JavaScript“ paprastai nėra rekomenduojamas. Styginių prototipą pateikiu kaip iliustracijas, rodančius įvairius hipotetinio standartinio metodo diegimus įterptame String prototipe.


Įgyvendinimas grindžiamas reguliariu reiškiniu

 String.prototype.replaceAll = function(search, replacement) { var target = this; return target.replace(new RegExp(search, 'g'), replacement); }; 

Atskyrimas ir sujungimas (funkcinis)

 String.prototype.replaceAll = function(search, replacement) { var target = this; return target.split(search).join(replacement); }; 

border=0

Nesuvokdamas per daug apie tai, kaip reguliarios išraiškos veikia užkulisiuose efektyvumo požiūriu, aš linkęs suskaidyti ir įvesti įgyvendinimą praeityje, nesvarstydamas našumo. Kai man įdomu, kas buvo veiksmingesnė, ir nuo kokio požiūrio jį panaudojau kaip pasiteisinimą sužinoti.

Mano kompiuteryje, kuriame veikia „Chrome“ „Windows 8“, reguliarus išraiškos pagrįstas įgyvendinimas yra greičiausias , o skaidymas ir prisijungimas įgyvendinamas lėtiau 53% . Reguliarių išraiškų reikšmė yra dvigubai greitesnė, kai įvedamas „lorem ipsum“, kurį naudoju.

Patikrinkite lyginamąjį indeksą vykdydami šiuos du veiksmus vienas prieš kitą.


border=0

Kaip pažymėta @ThomasLeduc ir kt. Komentaruose, gali kilti problemų, susijusių su išraiška pagrįstu įgyvendinimu, jei search yra tam tikrų simbolių, kurie reguliariai išreiškiami kaip specialieji simboliai . Įgyvendinant daroma prielaida, kad skambinantysis vengs styginių iš anksto arba perduos eilutes, kuriose nėra simbolių lentelėje „ Reguliarios išraiškos“ (MDN).

MDN taip pat užtikrina, kad būtų išvengta mūsų styginių. Būtų gerai, jei ji būtų standartizuota kaip RegExp.escape(str) , bet, deja, ji neegzistuoja:

 function escapeRegExp(str) { return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$ // $ means the whole matched string } 

Įgyvendindami „ String.prototype.replaceAll , galėtume paskambinti „ escapeRegExp “, bet nesu įsitikinęs, kiek tai paveiks našumą (galbūt net styginiams, kuriems nereikia pabėgti, kaip ir visos raidinės ir skaitmeninės eilutės).

1935 m
12 июля '13 в 4:46 2013-07-12 04:46 atsakymą pateikė Cory Gross, liepos 12 d., 13 val., 4:46, 2013-07-12 04:46
 var find = 'abc'; var re = new RegExp(find, 'g'); str = str.replace(re, ''); 

Atsakydami į komentarą „ Spustelėkite atnaujinti“ , galite dar labiau supaprastinti:

Mozilla“ kūrėjo tinklo „ JavaScript“ reguliarių išraiškų vadove , kur jie atitinka šią naudingumo funkciją: 

 function replaceAll(str, find, replace) { return str.replace(new RegExp(escapeRegExp(find), 'g'), replace); } 
3801
17 июля '09 в 20:54 2009-07-17 20:54 atsakymą pateikė Sean Bright liepos 17 d., 09:54, 2009-07-17 20:54

Pastaba Nenaudokite to tikruoju kodu.

Kaip alternatyvą paprastoms terminų eilutėms, galite naudoti

 str = "Test abc test test abc test...".split("abc").join(""); 

Bendras modelis

 str.split(search).join(replacement) 

Kai kuriais atvejais tai buvo greitesnė nei naudojant „ replaceAll ir reguliarią išraišką, tačiau šiuolaikinėse naršyklėse tai nėra. Taigi, ji tikrai turėtų būti naudojama tik kaip greitas įsilaužimas, kad būtų išvengta poreikio vengti regexp, o ne tikrojo kodo.

1236
17 июля '09 в 23:29 2009-07-17 23:29 atsakymą pateikė Matthew Crumley, liepos 17 d., 09:29, 2009-07-17 23:29

Reguliarios išraiškos naudojimas su g vėliavos rinkiniu pakeičia viską:

 someString = 'the cat looks like a cat'; anotherString = someString.replace(/cat/g, 'dog'); // anotherString now contains "the dog looks like a dog" 

Taip pat žr

543
07 мая '09 в 2:18 2009-05-07 02:18 atsakymas duotas Adomo A 07 gegužės '09 at 2:18 2009-05-07 02:18

Čia yra eilutės prototipo funkcija, pagrįsta priimtu atsakymu:

 String.prototype.replaceAll = function (find, replace) { var str = this; return str.replace(new RegExp(find, 'g'), replace); }; 

EDIT

Jei jūsų find yra specialių simbolių, juos reikia vengti:

 String.prototype.replaceAll = function (find, replace) { var str = this; return str.replace(new RegExp(find.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$ 'g'), replace); }; 

Fiddle: http://jsfiddle.net/cdbzL/

92
12 февр. atsakymas pateikiamas vasario 12 d. 2013-02-12 02:03 '13, 02:03 2013-02-12 02:03

Atnaujinti:

Jis buvo šiek tiek vėlai atnaujinimui, bet kadangi aš tiesiog pasiklydau į šį klausimą ir pastebėjau, kad mano ankstesnis atsakymas yra ne tas, kurį esu patenkintas. Kadangi klausimas buvo pakeisti vieną žodį, neįtikėtina, kad niekas negalvojo apie žodžių ribų naudojimą ( \b

 'a cat is not a caterpillar'.replace(/\bcat\b/gi,'dog'); //"a dog is not a caterpillar" 

Tai paprasta reguliari išraiška, kuri leidžia išvengti žodžių dalių pakeitimo daugeliu atvejų. Tačiau brūkšnys vis dar laikomas žodžio riba. Todėl šiuo atveju legenda gali būti naudojama siekiant išvengti styginių, pvz., cool-cat :

 'a cat is not a cool-cat'.replace(/\bcat\b/gi,'dog');//wrong //"a dog is not a cool-dog" -- nips 'a cat is not a cool-cat'.replace(/(?:\b([^-]))cat(?:\b([^-]))/gi,'$1dog$2'); //"a dog is not a cool-cat" 

Iš esmės šis klausimas yra toks pat, kaip čia: „ Javascript“ pakeičia „“ su „“ “

@Mike, patikrinkite atsakymą, kurį daviau ten ... regexp yra ne vienintelis būdas pakeisti daugelį padėties įvykių toli nuo jo. Pagalvokite apie lankstumą, galvokite, dalinkitės!

 var newText = "the cat looks like a cat".split('cat').join('dog'); 

Arba, kad būtų užkirstas kelias tam tikros žodžio dalims pakeisti, taip pat bus priimtas patvirtintas atsakymas! Šią problemą galite išspręsti naudodami reguliariąsias išraiškas, kurios, manau, yra šiek tiek sudėtingesnės ir todėl dar lėtesnės:

 var regText = "the cat looks like a cat".replace(/(?:(^|[^az]))(([^az]*)(?=cat)cat)(?![az])/gi,"$1dog"); 

Rezultatas yra toks pat, kaip ir priimtas atsakymas, tačiau šioje eilutėje vartojama išraiška / katė / g:

 var oops = 'the cat looks like a cat, not a caterpillar or coolcat'.replace(/cat/g,'dog'); //returns "the dog looks like a dog, not a dogerpillar or cooldog" ?? 

Tiesą sakant, tai tikriausiai ne tai, ko norite. Ką tada? IMHO - tai reguliari išraiška, pakeičianti „katę“ sąlyginai. (t. y. nėra žodžio dalis), pavyzdžiui:

 var caterpillar = 'the cat looks like a cat, not a caterpillar or coolcat'.replace(/(?:(^|[^az]))(([^az]*)(?=cat)cat)(?![az])/gi,"$1dog"); //return "the dog looks like a dog, not a caterpillar or coolcat" 

Manau, jis atitinka jūsų poreikius. Žinoma, tai nėra visapusiška apsauga, bet tai turėtų pakakti, kad pradėtumėte. Norėčiau rekomenduoti skaityti kažką kitą šiuose puslapiuose. Tai bus naudinga tobulinant šią išraišką, kad atitiktų jūsų konkrečius poreikius.

http://www.javascriptkit.com/jsref/regexp.shtml

http://www. regular-expressions.info


Galutinis priedas:

Atsižvelgiant į tai, kad šis klausimas vis dar turi daug požiūrių, aš maniau, kad galėčiau pridėti pavyzdį .replace naudojamą su atgalinio ryšio funkcija. Tokiu atveju tai labai supaprastina išraišką ir suteikia dar didesnį lankstumą, pvz., Pakeičiant teisingą kapitalizaciją arba keičiant cat ir cats vienu metu:

 'Two cats are not 1 Cat! They\'re just cool-cats, you caterpillar' .replace(/(^|.\b)(cat)(s?\b.|$)/gi,function(all,char1,cat,char2) { //check 1st, capitalize if required var replacement = (cat.charAt(0) === 'C' ? 'D' : 'd') + 'og'; if (char1 === ' '  char2 === 's') {//replace plurals, too cat = replacement + 's'; } else {//do not replace if dashes are matched cat = char1 === '-' || char2 === '-' ? cat : replacement; } return char1 + cat + char2;//return replacement string }); //returns: //Two dogs are not 1 Dog! They're just cool-cats, you caterpillar 
75
01 марта '12 в 13:02 2012-03-01 13:02 atsakymą pateikė Elias Van Ootegem, kovo 12 d., 13:02 2012-03-01 13:02

Atitinka visuotinę reguliarią išraišką:

 anotherString = someString.replace(/cat/g, 'dog'); 
53
07 мая '09 в 2:23 2009-05-07 02:23 atsakymas pateikiamas scronide 07 gegužės '09 at 2:23 2009-05-07 02:23
 str = str.replace(/abc/g, ''); 

Arba pabandykite pakeisti „allAll“ funkciją iš čia:

Kokie yra naudingi javascript metodai, kurie apima įterptus objektus?

 str = str.replaceAll('abc', ''); OR var search = 'abc'; str = str.replaceAll(search, ''); 

EDIT: Paaiškinimas, kaip galima pakeisti „allAll“

Pakeitimo metodas pridedamas prie eilutės prototipo. Tai reiškia, kad ji bus prieinama visiems styginių objektams / literatūroms.

Pavyzdžiui.

 var output = "test this".replaceAll('this', 'that'); //output is 'test that'. output = output.replaceAll('that', 'this'); //output is 'test this' 
38
17 июля '09 в 20:55 2009-07-17 20:55 Atsakymą davė SolutionYogi liepos 17 d., 09:55, 2009-07-17 20:55

Tarkime, kad norite pakeisti visus „abc“ su „x“:

 let some_str = 'abc def def lom abc abc def'.split('abc').join('x') console.log(some_str) //x def def lom xx def 

Bandžiau galvoti apie kažką paprastesnio nei keisti prototipo eilutę.

33
10 сент. Atsakymą pateikė Emilio Grisolía 10 Sep. 2016-09-10 17:59 '16 at 17:59 pm 2016-09-10 17:59

Naudokite įprastą išraišką:

 str.replace(/abc/g, ''); 
31
17 июля '09 в 20:56 2009-07-17 20:56 atsakymą pateikė Donnie DeBoer liepos 17 d., 09:56, 2009-07-17 20:56

Atskirų kabučių pakeitimas:

 function JavaScriptEncode(text){ text = text.replace(/'/g,' // More encode here if required return text; } 
28
20 июня '15 в 0:24 2015-06-20 00:24 Atsakymą pateikė Chris Rosete birželio 20 d., 15 val. 0:24 2015-06-20 00:24

// kilpa, kol skaičius pasirodys 0. Arba tiesiog nukopijuokite / įklijuokite

  function replaceAll(find, replace, str) { while( str.indexOf(find) > -1) { str = str.replace(find, replace); } return str; } 
22
05 июня '13 в 7:57 2013-06-05 07:57 atsakymas pateikiamas Raseela birželio 05 d. 13:57 2013-06-05 07:57

Tai greičiausia versija, kuri nenaudoja reguliarių išraiškų.

Peržiūrėtas jsperf

 replaceAll = function(string, omit, place, prevstring) { if (prevstring  string === prevstring) return string; prevstring = string.replace(omit, place); return replaceAll(prevstring, omit, place, string) } 

Tai beveik dvigubai greitesnis nei suskaidymo ir prisijungimo būdas.

Kaip nurodyta šiame komentare, tai neveiks, jei jūsų replaceAll("string", "s", "ss") kintamajame yra place , kaip: replaceAll("string", "s", "ss") , nes ji visada gali pakeisti kitą šio žodžio įvykį.

Yra dar viena „jsperf“ funkcija su galimybėmis ant mano rekursinio pakeitimo, kuris vyksta dar greičiau ( http://jsperf.com/replace-all-vs-split-join/12 )!

  • Atnaujinta 2017 m. Liepos 27 d. Atrodo, kad „RegExp“ dabar pasiekė greičiausią našumą neseniai išleistame „Chrome“ 59.
21
04 апр. Atsakymą pateikė Cole Lawrence 04 Bal. 2014-04-04 21:49 '14 ne 21:49 2014-04-04 21:49
 str = str.replace(new RegExp("abc", 'g'), ""); 

man geriau nei anksčiau minėti atsakymai. todėl new RegExp("abc", 'g') sukuria RegExp, kuris atitinka visą teksto buvimą ( 'g' vėliavą). Antroji dalis yra ta, kuri jūsų atveju pakeičiama tuščia eilute ( "" ). str yra eilutė, ir mes turime ją iš naujo apibrėžti, nes replace(...) paprasčiausiai grąžina rezultatą, bet jo nepaiso. Kai kuriais atvejais tai galite naudoti.

21
28 дек. atsakymą pateikė csomakk 28 d. 2017-12-28 15:27 '17 at 15:27 2017-12-28 15:27

RegExp naudojimas „ JavaScript“ gali padaryti viską, kas jums tinka, tiesiog atlikite kažką panašaus toliau, nepamirškite /g po kurio išsiskiria pasaulis:

 var str ="Test abc test test abc test test test abc test test abc"; str = str.replace(/abc/g, ''); 

Jei galvojate apie pakartotinį naudojimą, sukurkite funkciją, kuri jums tinka, tačiau tai nerekomenduojama, nes tai tik viena eilutė, tačiau, jei naudosite jį plačiai, galite rašyti kažką panašaus:

 String.prototype.replaceAll = String.prototype.replaceAll || function(string, replaced) { return this.replace(new RegExp(string, 'g'), replaced); }; 

ir tiesiog naudokite jį savo kode vėl ir vėl, kaip parodyta toliau:

 var str ="Test abc test test abc test test test abc test test abc"; str = str.replaceAll('abc', ''); 

Tačiau, kaip jau minėjau, tai nereiškia, kad bus daug kalbų apie eilučių ar našumo rašymą, tik talpyklos funkcija gali paveikti didesnį našumą ilgosiomis linijomis, taip pat gerą DRY kodo praktiką, jei norite pakartotinai naudoti.

18
06 июня '17 в 16:39 2017-06-06 16:39 Atsakymą Alireza pateikė birželio 06 d. 17 d. 4:39 2017-06-06 16:39

Jei tai, ką norite rasti, jau yra eilutėje, ir neturite įprastos išraiškos, galite naudoti prisijungti / padalinti:

20 июня '13 в 2:21 2013-06-20 02:21 atsakymas pateikiamas rakslice birželio 20 d. 13:21 2013-06-20 02:21
 function replaceAll(str, find, replace) { var i = str.indexOf(find); if (i > -1){ str = str.replace(find, replace); i = i + replace.length; var st2 = str.substring(i); if(st2.indexOf(find) > -1){ str = str.substring(0,i) + replaceAll(st2, find, replace); } } return str; } 
15
29 сент. Atsakymą pateikė Tim Rivoli 29 sep. 2014-09-29 22:12 '14, 10:12 pm 2014-09-29 22:12

Man patinka šis metodas (atrodo šiek tiek švaresnis):

 text = text.replace(new RegExp("cat","g"), "dog"); 
13
15 мая '13 в 17:03 2013-05-15 17:03 atsakymą pateikė Owen gegužės 15 d. 13 val. 2013-05-15 17:03
 while (str.indexOf('abc') !== -1) { str = str.replace('abc', ''); } 
12
29 апр. atsakymas pateikiamas zdennis 29 balandžio. 2014-04-29 13:25 '14, 13:25 2014-04-29 13:25
 var str = "ff ff ffa de def"; str = str.replace(/f/g,''); alert(str); 

http://jsfiddle.net/ANHR9/

12
04 сент. atsakymas pateikiamas pkdkk 04 sep . 2013-09-04 13:01 '13, 13:01, 2013-09-04 13:01

Jei eilutėje yra panašus modelis, pvz., abccc , galite naudoti:

 str.replace(/abc(\s|$)/g, "") 
11
07 окт. Atsakyti mostafa elmadany 07 Oct 2017-10-07 23:56 '17, 11:56 pm 2017-10-07 23:56

Ankstesni atsakymai yra pernelyg sudėtingi. Tiesiog naudokite pakeitimo funkciją taip:

 str.replace(/your_regex_pattern/g, replacement_string); 

Pavyzdys:

10
23 окт. Atsakymas pateikiamas „ Black 23 Oct 2018-10-23 12:34 '18 12:34 pm 2018-10-23 12:34

Jei bandote įsitikinti, kad ieškoma eilutė neegzistuos net po pakeitimo, turite naudoti kilpą.

Pavyzdžiui:

 var str = 'test aabcbc'; str = str.replace(/abc/g, ''); 

Kai baigsite, vis tiek turėsite „test abc“!

Lengviausias ciklas išspręsti šį klausimą:

 var str = 'test aabcbc'; while (str != str.replace(/abc/g, '')){ str.replace(/abc/g, ''); } 

Tačiau kiekvienam ciklui jis pradės keisti du kartus. Tai įmanoma (balsavimo rizika), kurią galima derinti šiek tiek efektyvesniam, bet mažiau suprantamai:

 var str = 'test aabcbc'; while (str != (str = str.replace(/abc/g, ''))){} // alert(str); alerts 'test '! 

Tai gali būti ypač naudinga ieškant dvigubų styginių.
Pavyzdžiui, jei turime „a ,, b“ ir norime pašalinti visas kablelių kopijas.
[Šiuo atveju būtų galima atlikti .replace (/, + / g, ','), bet tam tikru momentu reguliarioji išraiška tampa sudėtinga ir pakankamai lėta, kad galėtumėte pakabinti.]

9
28 сент. atsakymas, kurį pateikė SamGoody Sep 28 2014-09-28 22:58 '14, 10:58 pm 2014-09-28 22:58

Tiesiog sekite šią reguliarią išraišką oneliner, pridedant atvejo jautrumą, taigi, jei darote „ABC“, jis veiks kaip „abc“.

 str = str.replace(/abc/gi, ""); 
9
17 сент. atsakymą pateikė Ankit 17 sep . 2018-09-17 15:58 '18, 15:58 pm 2018-09-17 15:58
 var string = 'Test abc Test abc Test abc Test abc' string = string.replace(/abc/g, '') console.log(string) 
8
09 марта '18 в 12:41 2018-03-09 12:41 Ashutosh Narang atsakymas kovo 09-18 d. 12:41 pm 2018-03-09 12:41

Nors žmonės paminėjo naudodamiesi reguliariomis išraiškomis, yra geresnis požiūris, jei norite pakeisti tekstą nepriklausomai nuo teksto. Kaip didžiosios arba mažos raidės. Naudokite žemiau pateiktą sintaksę

 //Consider below example originalString.replace(/stringToBeReplaced/gi, ''); //Output will be all the occurrences removed irrespective of casing. 

Čia galite rasti išsamų pavyzdį.

8
03 мая '16 в 21:39 2016-05-03 21:39 atsakymą pateikė Cheezy Code 03 gegužės 16 d. 21:39 2016-05-03 21:39

Ši funkcija veikia man:

 String.prototype.replaceAllOccurence = function(str1, str2, ignore) { return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\ } ; 

Dabar skambinkite tokiomis funkcijomis:

 "you could be a Project Manager someday, if you work like this.".replaceAllOccurence ("you", "I"); 

Tiesiog nukopijuokite ir įklijuokite šį kodą iš naršyklės konsolės į TEST.

7
16 февр. Sandeep Gantait atsakymas 16 vasaris 2016-02-16 12:53 '16 at 12:53 2016-02-16 12:53

Galite pabandyti sujungti šiuos du galingus metodus.

 "test abc test test abc".split("abc").join("") 

Viltis padės!

7
09 окт. atsakymas pateikiamas Victor 09 okt. 2013-10-09 18:04 '13, 18:04 2013-10-09 18:04

Tiesiog pridėkite /g

 document.body.innerHTML = document.body.innerHTML.replace('hello', 'hi'); 

į

 // Replace 'hello' string with /hello/g regular expression. document.body.innerHTML = document.body.innerHTML.replace(/hello/g, 'hi'); 

/g reiškia pasaulinį

7
05 июня '15 в 10:16 2015-06-05 10:16 atsakymas pateikiamas Reza Fahmi birželio 05-15 dienomis 10:16 2015-06-05 10:16

Galite naudoti žemiau pateiktą metodą.

  function replaceAll(originalString, find, replace) { return originalString.replace(new RegExp(find, 'g'), replace); }; 
7
15 февр. atsakymas pateikiamas tk_ 15 vasario mėn. 2016-02-15 15:05 '16 at 15:05 2016-02-15 15:05
  • 1
  • 2

Kiti klausimai apie „ žymų arba „ Užduoti klausimą“