Javascript bir simli bütün dəyişiklikləri əvəz necə

Bu xətt var:

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

İcra

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

yuxarıda göstərilən xəttdə yalnız abc -nin baş verməsi görünür. Onun bütün görünüşünü necə əvəz edə bilərəm?

3522
17 июля '09 в 20:53 2009-07-17 20:53 Upvote basın 17 iyul '09 saat 20:53 'də quraşdırılmışdır 2009-07-17 20:53
@ 46 cavab
  • 1
  • 2

Tamlığı üçün mən bunun üçün hansı üsulu istifadə etməyi düşündüm. Əsasən, bu səhifənin digər cavabları ilə təklif edildiyi kimi bunu etmək üçün iki yol vardır.

Qeyd: Ümumiyyətlə, JavaScript-də yerləşdirilən prototipləri genişləndirmək məsləhət görülmür. Mən String prototipini sadəcə illüstrasiya üçün uzadılmalar kimi təqdim edirəm, bu da köklü String prototipində hipotetik standart metodun müxtəlif tətbiqlərini nümayiş etdirirəm.


Nümunəvi ifadəyə əsaslanan tətbiq

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

Ayrılma və birləşmə (funksional) İcra

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

border=0

Səmərəliliyi baxımından səhnələrin arxasında hansı normal ifadələr işlədiyini çox yaxşı bilmədən mən performans haqqında düşünmədən, bölünməyi və keçmişdə tətbiqə girməyə meyl etdim. Daha effektiv olanı merak etdiyim zaman və məndən hansı məqamdan öyrənmək üçün bir bəhanə kimi istifadə etdim.

Chrome Windows 8 ilə kompüterimdə mütəmadi ifadə əsasında tətbiq olunan proqram ən sürətli , split və birləşmə ilə 53% daha yavaş tətbiq olunur . Normal ifadələrin dəyəri mən istifadə etdiyim lorem ipsum yazmaq üçün iki dəfə çoxdur.

Bu iki tətbiqin bir-birinə qarşı işə salınması ilə müqayisə et .


border=0

@ThomasLeduc və digərləri tərəfindən şərhdə qeyd edildiyi kimi, search normal ifadələrdə xüsusi simvollar olaraq ayrılmış müəyyən simvollar varsa, ifadəyə əsaslanan tətbiq ilə problem ola bilər. Tətbiq zəng edənlərin öncədən strings qarşısını almaq və ya Normal ifadeler (MDN) cədvəldə simvol olmayan strings keçmək edəcək varsayar.

MDN həmçinin strings qarşısını almaq üçün bir həyata keçirir. RegExp.escape(str) kimi standartlaşdırıldığı təqdirdə gözəl olardı, amma, ümumiyyətlə, yoxdur:

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

escapeRegExp -ın həyata keçirilməsində escapeRegExp -i zəng edə String.prototype.replaceAll , amma bunun nə qədər təsir göstərəcəyinə əmin deyiləm (bəlkə hətta alfasayısal strings kimi heç bir qaçış tələb olunmayan strings üçün).

1935
12 июля '13 в 4:46 2013-07-12 04:46 Cavab Cory Gross tərəfindən 12 İyul, '13 'də 4:46 2013-07-12 04:46' də verilir
 var find = 'abc'; var re = new RegExp(find, 'g'); str = str.replace(re, ''); 

Click Upvote şərhinə cavab olaraq, onu daha da sadələşdirə bilərsiniz:

Mozilla Developer Network JavaScript Regular Expressions Guide -də təsvir olunur, burada aşağıdakı kommunal funksiyasını təmsil edirlər: 

 function replaceAll(str, find, replace) { return str.replace(new RegExp(escapeRegExp(find), 'g'), replace); } 
3801
17 июля '09 в 20:54 2009-07-17 20:54 Cavab Sean Bright tərəfindən 17 İyul '09 saat 20:54 'da verildi 2009-07-17 20:54

Qeyd Bunu gerçək kodda istifadə etməyin.

Sadə literal simli üçün normal ifadələrə alternativ olaraq istifadə edə bilərsiniz

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

Ümumi nümunə

 str.split(search).join(replacement) 

Bəzi hallarda bu replaceAll əvəzinə istifadə replaceAll və normal bir replaceAll daha sürətli idi, ancaq bu, müasir brauzerlərdə bu vəziyyət görünmür. Beləliklə, həqiqətən, yalnız real kod deyil, regexp qarşısını almaq üçün ehtiyac qarşısını almaq üçün sürətli bir hack kimi istifadə edilməlidir.

1236
17 июля '09 в 23:29 2009-07-17 23:29 Cavab Matthew Crumley tərəfindən 17 iyul 17: 09-da 23:29 2009-07-17 23:29 tarixində verilir

g bayraq dəsti ilə müntəzəm bir ifadə istifadə edərək, hər şeyi əvəz edir:

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

Həmçinin baxın

543
07 мая '09 в 2:18 2009-05-07 02:18 cavab Adam A 07 May '09 saat 02:18 'da verildi 2009-05-07 02:18

Burada qəbul edilmiş cavab əsasında simli prototip funksiyası:

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

EDIT

Tapşırıqda xüsusi simvollar varsa, bunlardan çəkinməlisiniz:

 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 февр. cavab cümə günü 12 fevralda verilir. 2013-02-12 02:03 '13 'da 2:03' de 2013-02-12 02:03

Yeniləmə:

Yeniləmə üçün bir az gec idi, amma bu sual üzərinə qışqırdığımdan və mənim əvvəlki cavabımdan məmnun olduğumun olmadığını nəzərə aldı. Sual bir sözlə əvəz olunduğundan, heç kimin söz hüdudlarından istifadə etməyi düşünmədiyi inanılmazdır ( \b )

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

Bu, əksər hallarda sözlərin hissələrinin əvəz edilməsinin qarşısını almaq üçün imkan verən sadə bir müntəzəm ifadədir. Ancaq bir daş hələ də bir söz sərhədi hesab olunur. Buna görə, əfsanə bu halda, cool-cat kimi strings əvəz qarşısını almaq üçün istifadə edilə bilər:

 '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" 

Əsasən, bu sual burada olduğu kimi eyni: Javascript "" ilə "" "" "

@Mike, orada verdiyim cavabı gözdən keçirin ... regexp ondan uzaq bir çoxluqun təkrarlanmasının tək yolu deyil. Rahatlıq düşünün, düşünün, paylaşın!

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

Alternativ olaraq, sözün bir hissəsinin dəyişdirilməsinin qarşısını almaq üçün təsdiq edilmiş cavab da qəbul olunacaq! Mən bu problemi ətrafında müntəzəm ifadələrdən istifadə edə bilərəm ki, bunu etiraf edirəm ki, bir qədər daha mürəkkəb və nəticədə daha yavaş olur:

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

Nəticə qəbul edilən cavabla eynidır, lakin bu xəttdə / cat / g ifadəsini istifadə edərək:

 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" ?? 

Əslində bu, bəlkə də istəmirsiniz. Nə vaxt? IMHO, şərti olaraq "pişik" əvəz edən müntəzəm ifadə. (yəni sözün bir hissəsi deyil), məsələn:

 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" 

Hesab edirəm ki, bu sizin ehtiyaclarınıza cavab verir. Əlbəttə ki, bu tam qorunma deyil, amma bu başlamağınız üçün kifayətdir. Bu səhifələrdə başqa bir şey oxumağı tövsiyə edirəm. Bu, bu ifadəni xüsusi ehtiyaclarınıza uyğunlaşdırmaq üçün faydalı olacaq.

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

http://www.regular-expressions.info


Sonuncu əlavə:

Bu sual hələ də bir çox nöqtəyə sahib olduğunu nəzərə alsaq, nümunə əlavə edə biləcəyimi düşündüm .replace geri çağırma funksiyasında istifadə edilən yer. Bu vəziyyət, ifadəni çox sadələşdirir və məsələn, düzgün bir kapitallaşmanın əvəzlənməsi və ya bir anda catcats dəyişdirilməsini daha da asanlaşdırır:

 '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 cavab Elias Van Ootegem tərəfindən 01.03.2012 tarixində saat 13:02 'də verilir

Qlobal müntəzəm ifadəyə uyğunlaşır:

 anotherString = someString.replace(/cat/g, 'dog'); 
53
07 мая '09 в 2:23 2009-05-07 02:23 cavab 07 may '09 saat 02:23 'də verildi. 2009-05-07 02:23
 str = str.replace(/abc/g, ''); 

Yoxsa əvəzini burada əvəz et.

Gömülü obyektləri genişləndirən faydalı javascript üsulları hansılardır?

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

EDIT: əvəzin mövcudluğuna dair açıqlamaAll

Replace bütün üsul String prototipinə əlavə edilir. Bu deməkdir ki, bütün simli obyektlər / litals üçün mövcud olacaq.

məsələn.

 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 Cavab 17 iyul 17: 09-da SolutionYogi tərəfindən 20: 55- də verilmişdir 2009-07-17 20:55

Bütün "abc" i "x" ilə əvəz etmək istəyirik:

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

Prototip simli dəyişmədən daha sadə bir şey düşünməyə çalışdım.

33
10 сент. Cavab Emilio Grisolía tərəfindən verilir 10 Sep. 2016-09-10 17:59 '16 saat 17:59 'də 2016-09-10 17:59

Normal bir ifadəni istifadə edin:

 str.replace(/abc/g, ''); 
31
17 июля '09 в 20:56 2009-07-17 20:56 Cavab Donnie DeBoer tərəfindən 17 İyul '09 saat 20:56 'də verildi 2009-07-17 20:56

Tək quotes dəyişdirilməsi:

 function JavaScriptEncode(text){ text = text.replace(/'/g,' // More encode here if required return text; } 
28
20 июня '15 в 0:24 2015-06-20 00:24 Cavab Chris Rosete tərəfindən 20 İyun '15 'də 0:24 2015-06-20 00:24' də verilir

// sayı 0-a kimi görünənə qədər looplayın. Və ya sadəcə surəti / yapışdırın

  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 Cavab Raseela 5 iyun 2013-cü il saat 07: 57 -da verilir

Bu normal ifadələrdən istifadə etməyən ən sürətli versiyasıdır.

Yenilənmiş jsperf

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

Bu split və birləşmə metodu kimi demək olar ki, iki dəfə çoxdur.

Burada şərhdə qeyd edildiyi kimi, bu replaceAll("string", "s", "ss") dəyişən place olduğu kimi replaceAll("string", "s", "ss") : replaceAll("string", "s", "ss") , çünki həmişə bu sözün başqa bir yerini dəyişə bilər.

Daha sürətli ( http://jsperf.com/replace-all-vs-split-join/12 ) gedən təkrarlanan əvəzləmə variantları ilə başqa bir jsperf var!

  • 27 İyul 2017-də yeniləndi. Göründüyü kimi, hazırda RegExp şirkəti yaxınlarda buraxılan Chrome 59-da ən sürətli performansa sahibdir.
21
04 апр. Cavab Cole Lawrence tərəfindən verilir 04 Apr. 2014-04-04 21:49 '14 saat 21:49 2014-04-04 21:49
 str = str.replace(new RegExp("abc", 'g'), ""); 

yuxarıdakı cavablardan daha yaxşı işləmişəm. Buna görə də, new RegExp("abc", 'g') , mətnin bütün mövcudluğuna ( 'g' bayrağı) uyğun olan RegExp yaradır ( "abc" ). İkinci hissəsi sizin yerinizdə boş bir dize ( "" ) ilə əvəz olunur. str bir simli və onu replace(...) lazımdır, çünki replace(...) sadəcə nəticəni verir, lakin onu ləğv etmir. Bəzi hallarda bunu istifadə edə bilərsiniz.

21
28 дек. csomakk tərəfindən verilmiş cavab 28 Dekabr. 2017-12-28 15:27 '17 də 15:27 2017-12-28 15:27

JavaScript-də RegExp -dən istifadə etmək sizin üçün bütün işləri edə bilər, yalnız aşağıdakı kimi bir şey edin, qlobal birinin önə çıxdığını unutma:

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

Yenidən istifadə etmək barədə düşünürsəniz, sizin üçün bir funksiya yaradın, ancaq bunun bir xətt funksiyası olduğu kimi, tövsiyə olunmur, amma yenə də onu geniş istifadə edərsən, belə bir şey yaza bilərsiniz:

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

və yalnız aşağıda göstərildiyi kimi kodu təkrar-təkrar istifadə edin:

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

Amma əvvəllər qeyd etdiyim kimi bu, xətləri və ya işləmələri baxımından çox əhəmiyyət kəsb etmir, yalnız bir funksiyanı caching uzun xətləri üstün performansına təsir edə bilər, eləcə də yenidən istifadə etmək istəyirsinizsə, DRY kodu yaxşı tətbiq olunur.

18
06 июня '17 в 16:39 2017-06-06 16:39 Cavab Alireza tərəfindən 06 iyun '17' də 4:39 2017-06-06 16:39 'də verilir

Tapmaq istədiyin şey zaten simgededir ve normal ifadeli eskortörünüz yoxsa, katıl / ayrılmayı istifadə edə bilərsiniz:

20 июня '13 в 2:21 2013-06-20 02:21 cavab 20 iyun 'da 2:21' də verildi. 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 сент. Cavab Tim Rivoli tərəfindən verilir . 2014-09-29 22:12 '14 saat 10:12 'da 2014-09-29 22:12

Mən bu üsulu sevirəm (bir az təmiz görünür):

 text = text.replace(new RegExp("cat","g"), "dog"); 
13
15 мая '13 в 17:03 2013-05-15 17:03 Cavab Owen tərəfindən 15 May 'da 17:03' də verilir. 2013-05-15 17:03
 while (str.indexOf('abc') !== -1) { str = str.replace('abc', ''); } 
12
29 апр. Cavab zdennis 29 apr verilir . 2014-04-29 13:25 '14 at 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 сент. cavab pkdkk 04 sep verilir . 2013-09-04 13:01 '13 'da 13:01' də 2013-09-04 13:01

abccc kimi oxşar bir model varsa, bu istifadə edə bilərsiniz:

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

Əvvəlki cavablar çox mürəkkəbdir. Yalnız əvəz funksiyasını aşağıdakı kimi istifadə edin:

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

Məsələn:

10
23 окт. Cavab qara 23 oct verilir . 2018-10-23 12:34 '18 də 12:34 'də 2018-10-23 12:34

Aradığınız simli dəyişdirildikdən sonra belə olmayacaqsa, loop istifadə etməliyik.

Məsələn:

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

Bitirdiğinizde, hələ də "test abc" olacaqsınız!

Bu sualı həll etmək üçün ən asan dövr:

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

Lakin hər bir dövr üçün iki dəfə əvəz ediləcək. Bir az daha səmərəli, lakin az oxunaqlı forma birləşdirilə bilən (səsvermə riski) mümkündür:

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

Duplicate strings üçün axtarış zamanı xüsusilə faydalı ola bilər.
Məsələn, əgər biz "a" b, və biz vergüllərin bütün dublikatları çıxarmaq istəyirik.
[Bu halda, bunu etmək mümkün olardı. (/, + / G, ','), lakin bir nöqtədə normal ifadələr çətinləşir və asmaq üçün kifayət qədər yavaş olur.]

9
28 сент. SamGoody tərəfindən verilmiş cavab Sep 28 2014-09-28 22:58 '14 at 10:58 pm 2014-09-28 22:58

Yalnız "ABC" etsəniz, "abc" kimi çıxış edəcəyi halda, onsuz da bu sadiq ifadəyə əməl edin.

 str = str.replace(/abc/gi, ""); 
9
17 сент. Cavab Ankit 17 sep tərəfindən verilir . 2018-09-17 15:58 '18 at 3: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 tərəfindən verilmiş cavab 09 mart '18 saat 12:41 'də 2018-03-09 12:41

Müntəzəm ifadələrdən istifadə edənlər qeyd etdilərsə də, mətnin vəziyyətindən asılı olmayaraq mətni əvəz etmək istəyirsinizsə daha yaxşı bir yanaşma var. Böyük və ya kiçik hərflər kimi. Aşağıdakı sözdizimdən istifadə edin

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

Burada ətraflı bir nümunəyə müraciət edə bilərsiniz .

8
03 мая '16 в 21:39 2016-05-03 21:39 Cavab Cheezy Məcəlləsində 03 May '16 saat 21:39 2016-05-03 21:39 'də verilir

Aşağıdakı funksiya mənim üçün işləyir:

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

İndi bu kimi funksiyaları zəng edin:

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

Yalnız bu kodu brauzer konsolundan TEST-ə surətlə yapışdırıb yapışdırın.

7
16 февр. cavab Sandeep Gantait tərəfindən verildi 16 Fevral. 2016-02-16 12:53 '16 at 12:53 2016-02-16 12:53

Bu iki güclü metodu birləşdirməyə çalışa bilərsiniz.

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

Ümid kömək edəcək!

7
09 окт. cavab Victor 09 oktyabr verilir . 2013-10-09 18:04 '13 at 18:04 2013-10-09 18:04

Yalnız əlavə edin /g

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

üçün

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

/g qlobal deməkdir

7
05 июня '15 в 10:16 2015-06-05 10:16 Cavab Rza Fahmi 05 iyun 'da saat 10:16' da verilir 2015-06-05 10:16

Sadəcə aşağıdakı üsuldan istifadə edə bilərsiniz.

  function replaceAll(originalString, find, replace) { return originalString.replace(new RegExp(find, 'g'), replace); }; 
7
15 февр. cavab tk_ 15 fevral. 2016-02-15 15:05 '16 saat 15:05 'də 2016-02-15 15:05
  • 1
  • 2

tags ilə bağlı digər suallar və ya bir sual