2017-01-20 7 views
6

bir metinde verilen listeden tüm kısayolları yararlanmakregex verimli bir kısayol listesine sahip

var myText = "Lorem ipsum... Efa, efa, EFA ..."; 

yerine mümkün mü Kısayol listesinin kısayolu ile eşleşen tüm sözcükler, regex kullanarak kısayolun büyük harfli bir sürümü ile eşleşir? String.prototype.replace() kullanarak bir döngü olmadan bunu yapmak mümkün mü?

benim örnekte istenen sonucu olacaktır:

myText = "Lorem ipsum... EFA, EFA, EFA ..."; 

cevap

6

dize dizisi ile tek düzenli ifade oluşturmak ve bir geri arama String#replace yöntemi kullanılarak yerine dize.

var shortcuts = ["efa", "ame", "ict", "del", "aps", "lfb", "bis", "bbc"]; 
 

 
var myText = "Lorem ipsum... Efa, efa, EFA ..."; 
 

 
// construct the regex from the string 
 
var regex = new RegExp(
 
    shortcuts 
 
    // iterate over the array and escape any symbol 
 
    // which has special meaning in regex, 
 
    // this is an optional part only need to use if string cotains any of such character 
 
    .map(function(v) { 
 
    // use word boundary in order to match exact word and to avoid substring within a word 
 
    return '\\b' + v.replace(/[|\\{}()[\]^$+*?.]/g, '\\$&') + '\\b'; 
 
    }) 
 
    
 
    // or you can use word boundary commonly by grouping them 
 
    // '\\b(?:' + shortcuts.map(...).join('|') + ')\\b' 
 
    
 
    // join them using pipe symbol(or) although add global(g) 
 
    // ignore case(i) modifiers 
 
    .join('|'), 'gi'); 
 

 
console.log(
 
    // replace the string with capitalized text 
 
    myText.replace(regex, function(m) { 
 
    // capitalize the string 
 
    return m.toUpperCase(); 
 
    }) 
 
    // or with ES6 arrow function 
 
    // .replace(regex, m => m.toUpperCase()) 
 
);


bakın: Converting user input string to regular expression

+1

şaşırtıcı. Açıklamak ister misiniz? –

+0

@ daniel.sedlacek: bazı açıklamalar ekledi –

+1

Normalde, "america" ​​gibi sözcükleri "AMErica" ​​( –

0

hiçbir join ile basit yaklaşım:

var shortcuts = ["efa","ame","ict","del","aps","lfb","bis","bbc"], myText = "Lorem ipsum... Efa, efa, EFA ..aps apS whatever APS."; 
shortcuts.map((el)=> { 
myText = myText.replace(new RegExp('\\b'+el+'\\b',"gi"), el.toUpperCase()) 
}); 
console.log(myText); 
2

, ilk kısayolları dizi kontrol ve bunu sadece biliyorum varsayarsak devamı ains karakterler:

const shortcuts = ["efa","ame","ict","del","aps","lfb","bis","bbc"] 
 

 
var text = "Lorem ipsum... Efa, efa, EFA, ame, America, enamel, name ..." 
 

 
var regex = new RegExp("\\b(" + shortcuts.join('|') + ")\\b", 'gi') 
 

 
console.log(text.replace(regex, s => s.toUpperCase()));

\b sınırları kelimelerle içindeki kısayoların önleyecektir.

+1

). '\\ b | \\ b') ' –

+1

veya' "\\ b (" + shortcuts.join ('|') + ") \\ b" ' –

+0

Gerçekten. Teşekkürler. –