Normal ifadede bir değişkeni nasıl kullanırsınız?


1379

String.replaceAll()JavaScript'te bir yöntem oluşturmak istiyorum ve bir regex kullanmanın bunu yapmak için en kısa yol olacağını düşünüyorum. Ancak, bir değişkeni regex'e nasıl aktaracağımı anlayamıyorum. Ben tüm örneklerini yerini alacak zaten yapabilir "B"ile "A".

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

Ama böyle bir şey yapmak istiyorum:

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

Ama açıkçası bu sadece metnin yerini alacak "replaceThis"... peki bu değişkeni regex dizime nasıl aktarabilirim?


9
Şu anda bu işlevselliği JavaScript'e eklemek için çalıştığımızı ve bununla ilgili bir fikriniz varsa lütfen tartışmaya katılın.
Benjamin Gruenbaum

Yanıtlar:


1841

/regex/gSözdizimini kullanmak yerine yeni bir RegExp nesnesi oluşturabilirsiniz:

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

Bu şekilde dinamik olarak regex nesneleri oluşturabilirsiniz. Sonra yapacaksın:

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

272
Eğer bir ifade gibi kullanmanız gerekiyorsa /\/word\:\w*$/, sizin ters eğik çizgi kaçış emin olun: new RegExp( '\\/word\\:\\w*$' ).
Jonathan Swinney

2
@gravityboy ('' + myNumber) .replace (/ 10 / g, 'a') yapabilir veya onaltılık sayılar istiyorsanız, parseInt ('' + myNumber, 16) öğesini onluktan onaltılığa dönüştürmek için yapabilirsiniz.
Eric Wendelin

29
Soru, RegEx'in yalnızca sabit bir dize değiştirme işlemi için kullanıldığını göstermektedir. Dize RegEx meta karakterleri içeriyorsa başarısız olacağından yanıt yanlıştır. Üzücü bu yüksek oy, birçok baş ağrısı yapacak ...
dronus

16
Bunun bir değişkeni geçmesinin bir örneği bunu iyi bir cevap haline getirecektir. Bunu okuduktan sonra hala mücadele ediyorum.
Goose

3
@JonathanSwinney: dizgiden /regex oluşturursanız özel bir anlamı yoktur, bu yüzden kaçmanıza gerek yoktur. /\/word\:\w*$/olmalınew RegExp('/word\\:\\w*$')
Dávid Horváth

211

Eric Wendelin'in de belirttiği gibi, böyle bir şey yapabilirsiniz:

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

Bu sonuç verir "regex matching .". Ancak str1 ise başarısız olur ".". Sonucun "pattern matching regex", periyodun yerine geçmesini beklersiniz "regex", ancak ...

regexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregexregex

Bunun nedeni, "."bir String olmasına rağmen , RegExp yapıcısında hala normal bir ifade olarak yorumlanır, yani herhangi bir satır sonu karakteri olmayan, yani dizedeki her karakter anlamına gelir. Bu amaçla, aşağıdaki işlev yararlı olabilir:

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

Sonra şunları yapabilirsiniz:

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

verim "pattern matching regex".


4
Değiştirilecek ilk parametrenin normal bir dize olabileceğini ve regexp olması gerekmediğini biliyor musunuz? str1 = "."; alert ("örüntü eşleme.". yerine koy (str1, "string"));
bazı

@some: tabii ki. Çünkü yukarıdaki örnek önemsizdir. Örneğin, normal bir dizeyle birleştirilmiş bir deseni aramanız veya değiştirmeniz gerektiğinde, str.match (new RegExp ("https?: //" + RegExp.escape (myDomainName))), örneğin, escape işlevinin can sıkıcı olması değil yerleşik.
Gracenotes

Artı, görünüşe göre JC Grubbs küresel bir değişim gerektiriyordu; String.replace (String, String) ile genel bir değiştirme uygulamak büyük girdi için yavaş olabilir. Sadece diyorum ki, en iyi iki çözüm hatalı ve belirli girdilerde beklenmedik bir şekilde başarısız olacak.
Gracenotes

4
developer.mozilla.org/tr-TR/docs/JavaScript/Guide/… benzer bir işlev sunar, ancak bunlar hariç tutar -ve içerir =!:/.
chbrown

8
Doğru terim "alıntı" değil, "kaçış" tır. Sadece BTW.
Lawrence Dol

118

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

Her zaman olduğu gibi: gerekmedikçe regex kullanmayın. Basit bir dize değiştirme için deyim:

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

O zaman Gracenotes'in cevabında belirtilen alıntı sorunları hakkında endişelenmenize gerek yok.


11
Ve bunun normal ifadeden daha hızlı olduğunu ölçtünüz mü?
Mitar

3
Bu, özellikle '.' Gibi özel regex karakterlerle eşleşmesi gerektiğinde tercih edilir.
Krease

1
Uhm ... Ayrılmaz bir RegExp al; öyleyse, aynı soruna neden olmaz mı? Her neyse ... .split (). Join () bazı platformlarda daha yavaş olabilir, çünkü iki işlem olurken .replace () bir işlemdir ve optimize edilebilir.

5
@ PacMan--: her ikisi de splitve replacebir dize veya bir RegExpnesne alabilir. Sorun replaceo vardır splitdeğil bir dize kullandığınızda yalnızca tek bir yedek olsun olmasıdır.
bobince

1

38

TÜM yinelemeleri ( g) almak istiyorsanız , büyük / küçük harfe duyarsız olun ( i) ve başka bir sözcük ( \\b) içindeki bir sözcük olmaması için sınırları kullanın :

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

Misal:

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.

teşekkür ederim! (afaict, sizinki rxşablon dizeleri aracılığıyla Emacs / stil interpolasyonu ile tek cevaptır .)
sam boosalis

34

Eşleştirme yöntemiyle değişken kullanmak isteyen herkes için bu benim için çalıştı

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


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

Ben ekstra (& anlamsız) değişken oluşturmaz gibi bu yanıtı seviyorum.
Wick

14

Normal ifadeyi dinamik olarak oluşturmak istiyorsunuz ve bunun için doğru çözüm yapıcıyı kullanmaktır new RegExp(string). Yapıcının özel karakterleri tam anlamıyla ele alabilmesi için onlardan kaçmanız gerekir. Bir Orada yerleşik olan işlev Widget jQuery UI otomatik tamamlama denilen $.ui.autocomplete.escapeRegex:

[...] yerleşik $.ui.autocomplete.escapeRegexişlevi kullanabilirsiniz. Tek bir dize bağımsız değişkeni alır ve tüm normal ifadelerden kaçarak sonucun güvenli bir şekilde iletilmesini sağlar new RegExp().

JQuery UI kullanıyorsanız, bu işlevi kullanabilir veya tanımını kaynaktan kopyalayabilirsiniz :

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

Ve şu şekilde kullanın:

"[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]"

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

Bu araçla test et


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

Gibi test edin:

var whatever = 'Some [b]random[/b] text in a [b]sentence.[/b]'

console.log(whatever.replaceAll("[", "<").replaceAll("]", ">"))

4

İşte başka bir replaceAll uygulaması:

    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;
    };

4

Ve Steven Penny'nin cevabının kahve versiyonu, bu # 2 google sonucu olduğu için .... kahve sadece bir sürü karakter kaldırılmış olsa bile javascript ...;)

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

ve benim özel durumumda

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

neden bir aşağı oy? coffeescript -IS- kendi özel sözdizimine sahip javascript.
düşkün

robot.name=hubotjavascript değildir.
Temmuz

3

Dinamik olarak oluşturulmuş RegExp'leri yapabilirsiniz (bu soruya verilen diğer yanıtlara göre), yorumumu benzer bir yazıdan yankılayacağım : String.replace () işlevinin biçimi son derece yararlıdır ve birçok durumda dinamik olarak oluşturulan RegExp nesneleri. (bu bir tür acıdır çünkü RegExp yapıcısına girişi eğik çizgiler / [AZ] + / regexp değişmez biçimini kullanmak yerine bir dize olarak ifade etmeniz gerekir)


3

Bir Düzenli İfadeye bir değişken / diğer ad / işlev ekleme ihtiyacımı karşılamak için, ben bu ile geldi:

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

String.prototype.replaceAll = this.replace(newre(oldre), "withThis");

Burada 'oldre', bir değişken eklemek istediğim orijinal regexp, 'xx' bu değişken / diğer ad / işlev için yer tutucudur ve 'yy' gerçek değişken adı, diğer ad veya işlevdir.


2

$ 1 sizinle çalışmazsa bunu kullanabilirsiniz

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

1

Her zaman indexOftekrar tekrar kullanabilirsiniz :

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);
};

Değişim eşleşmeyi içerdiğinde bu sonsuz döngüye girmez.


1

Çözümünüz burada:

Bir değişkeni normal ifadeye iletin.

Uyguladığım değer, değiştirmek istediğiniz metin alanından değeri almak ve diğeri ise "ile değiştir" metin alanı, bir değişkendeki metin alanından değeri almak ve değişkeni RegExp olarak ayarlamaktır. işlevini değiştirmek için. Benim durumumda Jquery kullanıyorum, sadece JavaScript ile de yapabilirsiniz.

JavaScript kodu:

  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));
  });

Bu kod, bir düğmenin Onclick olayındadır, bunu çağrılacak bir işleve koyabilirsiniz.

Yani artık replace işlevinde değişken iletebilirsiniz.


Replace_with değişkeniniz değerin kendisini değil DOM öğesini içerecektir
Ben Taliadoros

1

Bu kendi kendine çağırma işlevi, bir dizin kullanarak replacerItems üzerinde yinelenir ve her geçişte dizede global olarak replacerItems [index] değerini değiştirir.

  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'

0

Bu cevapların hiçbiri bana açık değildi. Sonunda iyi bir açıklama buldum http://burnignorance.com/php-programming-tips/how-to-use-a-variable-in-replace-function-of-javascript/ adresinde

Basit cevap:

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

Örneğin:

$("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>


1
Bir kapatma değişkeninin üzerine yazıyorsunuz, kullanmanıza gerek yok var burada yok. Ayrıca, geçerseniz \bveya \1kırılırsa.
CyberAP

0

Düzenli ifadeler olmadan çoklu değiştirme için aşağıdakilerle gittim:

      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

Çözümün önemli kısmı burada bulundu

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.