javascript
  • regex
  • string
  • 2017-01-30 62 views 1 likes 
    1

    我有以下情況模板處理,串重複{{重複5}}

    輸入

    var str = '{{repeat 2}} some string {{/repeat}}'; 
    

    輸出

    str = 'some string, some string'; 
    

    輸入

    var str = '{{repeat 2}}{"prop1":"some data"}{{/repeat}}'; 
    

    輸出

    str = '{"prop1":"some data"}, {"prop1":"some data"}'; 
    

    輸入

    var str = 'start of string {{repeat 2}} some string {{/repeat}} another string '; 
    

    輸出

    str = 'start of string some string, some string another string'; 
    

    我想做到這一點的方式

    var test = "{{repeat 5}} test this string {{/repeat}}"; 
    var arrStr = test.split(/[{{]/); 
    

    並通過循環處理arrStr

    任何其他好的方法來做到這一點?如何找到在重複內重複計數和字符串的重複? 。

    +1

    '/ [{{] /'相當於'/ [{] /'和'/ \ {/'。這是一個字符類,而不是一系列字符。 – Xufox

    +0

    @Xufox我只想得到{{repeat – Shafeeque

    +0

    這看起來像是嘗試創建自己的字符串模板引擎。第一點:你可能不想寫一個模板引擎。使用現有的,有不少好的選擇。 (「但我只需要這個小功能」不是一個可接受的反參數)第2點:您可能不想編寫基於正則表達式的模板語言解析器。這是浪費時間,它不會工作。如果你想正確地做到這一點,你需要一個標記器,一個解析器,一個編譯器等。[peg.js](https://pegjs.org/)可以幫助你。你可以這樣做,但其他人已經擁有了,請參閱第1點。 – Tomalak

    回答

    1

    可以更換的文本替換一個回調裏面:

    function fillArray(s, num) { 
     
        var arr = []; 
     
        for (var i=0; i<num; i++) { 
     
        arr.push(s); 
     
        } 
     
        return arr; 
     
    } 
     
    var str = 'start of string {{repeat 2}} some string {{/repeat}} another string '; 
     
    var res = str.replace(/{{repeat\s+(\d+)}}([\s\S]*?){{\/repeat}}/g, function($0, $1, $2) { 
     
        return fillArray($2.trim(), parseInt($1, 10)).join(", "); 
     
    }); 
     
    console.log(res);

    fillArray函數創建與提取字符串出現的必要數量的數組。

    的正則表達式來得到你需要的是什麼樣子

    /{{repeat\s+(\d+)}}([\s\S]*?){{\/repeat}}/g 
    

    詳細

    • {{repeat - 一個文字字符序列
    • \s+ - 1+空格
    • (\d+) - 集團1:一個或多個數字
    • }} - 字面}}
    • ([\s\S]*?) - 第2組,任何0+字符,儘可能少到第一
    • {{\/repeat}} - 字面{{/repeat}}
    +0

    這不適用於像{{repeat 2}}這樣的結構這是{{repeat 2}}加倍{{/ repeat}}文本{{/ repeat }}'。正則表達式不是一個很好的方法來處理這個任務。 – Tomalak

    1

    String.prototype.repeat()可能是你所感興趣的東西 因爲它只是重複字符串沒有逗號,下面還要爲你做的:

    function repeatString(s, count) { 
        return (s + ", ").repeat(count).replace(/,\s$/, ""); 
    } 
    

    現在你可以使用像

    function repeatString(s, count) { 
     
        return (s + ", ").repeat(count).replace(/,\s$/, ""); 
     
    } 
     
    
     
    var s = "some string"; 
     
    var res = "start of string " + repeatString(s, 2) + " other string"; 
     
    
     
    console.log(res);

    注意repeat()並非所有支持在寫這篇的時候瀏覽器,但你可以使用Polyfill


    如果從HTML或東西讓你的字符串中的{{重複...}}已經在,下面會做的伎倆:

    function repeatString(s) { 
     
        var count = s.match(/\{\{repeat\s(\d*)\}\}/)[1]; 
     
        return (s.replace(/\{\{repeat\s\d*\}\}\s(.*)\s\{\{\/repeat\}\}/, "$1") + ", ").repeat(count).replace(/,\s$/, ""); 
     
    } 
     
    
     
    var s = "{{repeat 5}} some string {{/repeat}}"; 
     
    var res = "start of string " + repeatString(s) + " other string"; 
     
    
     
    console.log(res);

    值得一提的,目前已經可以作爲開源項目很多很多的HTML模板引擎。在大多數情況下,最好使用其中一個而不是重新發明輪子。

    +0

    這將幫助我重複字符串,找到{{repeat是我在 – Shafeeque

    +0

    中卡住的東西你不需要找到{{通過使用這個@Shafeeq – baao

    +0

    對我來說就像{{repeat 5}}一些字符​​串{{/ repeat}} – Shafeeque

    相關問題