2017-01-20 11 views
6

に与えられたリストからすべてのショートカットを大文字:正規表現 - 効率的に私はショートカットのリストを持っているテキスト

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

と様々な時価総額のテキストのボディ:

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

を交換することが可能ですショートカットリストにマッチするテキスト内のすべての単語が、正規表現を使用してショートカットの大文字に変換されたものですか?ループなしでこれを行うことは可能ですかString.prototype.replace()

私の例では望ましい結果は次のようになります。

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

答えて

6

は、文字列の配列を持つ単一の正規表現を生成し、コールバックでString#replaceメソッドを使用して文字列を置換します。

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


参照してください:なしjoinConverting user input string to regular expression

+1

素晴らしいです。あなたはそれを説明してもらえますか? –

+0

@ daniel.sedlacek:いくつかの説明を追加しました –

+1

正規表現のショートカットの周りに単語境界を追加する必要があります。そうしないと、 "AMERICA"のような単語が "AMErica"に変換されます –

0

簡単な方法:あなたが最初のショートカットの配列を制御し、あなただけのことを知っていると仮定すると、

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

cont AINSの文字:

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境界は言葉内のショートカットを置き換える避けることができます。

+1

'join '\\ b | \\ b') ' –

+1

または' '\\ b(" + shortcuts.join( '|')+ ")\\ b" ' –

+0

確かに。ありがとう。 –

関連する問題