1. 程式人生 > >grunt-text-replace 和正則的一些小記

grunt-text-replace 和正則的一些小記

1、grunt-text-replace

使用grunt來壓縮前端檔案的時候,經常涉及到index檔案種的內容替換,grunt-text-replace是實現這種功能的一個外掛。npm網站上對grunt-text-replace的用法有多種介紹,一般有下面兩種:
1、第一種

replace: {
  example: {
    src: ['text/*.txt'],             // source files array (supports minimatch) 
    dest: 'build/text/',             // destination directory or file 
replacements: [{ from: 'Red', // string replacement to: 'Blue' }, { from: /(f|F)(o{2,100})/g, // regex replacement ('Fooo' to 'Mooo') to: 'M$2' }, { from: 'Foo', to: function (matchedWord) { // callback replacement return matchedWord + ' Bar'
; } }] } }

2、第二種

replace: {
  another_example: {
    src: ['build/*.html'],
    overwrite: true,                 // overwrite matched source files 
    replacements: [{
      from: /[0-9]{1,2}\/[0-9]{1,2}\/[0-9]{2,4}/g,
      to: "<%= grunt.template.today('dd/mm/yyyy') %>"
    }]
  }
}

第一種有dest目標檔案,一般都是將原始檔進行替換後,再壓縮到目標檔案。
而第二種方法是重寫原始檔,即原始檔保留,把裡面的內容進行替換。以第二種方法為例進行介紹,
(1)src

為要操作的原始檔;
(2)overwrite為true時表示會重寫原始檔;
(3)from為一個正則表示式,用來匹配查詢要替換的內容;
(4)to為用來替換的內容,它可以直接是一個字串,也可以是一個function,當然function最後還是要返回一個字串,用來替換原始檔的內容。

例如下面這段程式碼:

numberRe: {
     src: ['../index.phtml'],
     overwrite: true,
     replacements: [{
     from: /(version:")([0-9.]+)(")[\S\s]*(isDebug: true)/g,
     to: function(matchedWord, index, fullText, regexMatches){
     var regN = /[0-9]+$/;
     var versionNum = parseInt(regexMatches[1].match(regN), 10) + 1;
     var addVer = regexMatches[1].replace(regN, versionNum);
     return matchedWord.replace(/(version:")([0-9.]+)(")[\S\s]*(isDebug: true)/, "$1"+addVer+"$3"+",\nisDebug: false");
       
       }
       }]
    }

關鍵字to的值就是一個function,注意這個function是可以傳參的,它有四個引數,分別為: (1)matchedWord 根據form正則表示式匹配出來的the matched world(完全匹配的內容)
(2)index 是一個下標,指向匹配內容第一次出現的地方
(3)fullText 所有的原始檔內容
(4)regexMatches 是一個數組,裡面是正則表示式匹配出的內容,注意這些內容是正則表示式種用()包含起來的大原子所匹配出來的內容。 例如官方文件種給出的例子:

// Where the original source file text is:  "Hello world" 
 
replacements: [{
  from: /wor(ld)/g,
  to: function (matchedWord, index, fullText, regexMatches) {
    // matchedWord:  "world" 
    // index:  6 
    // fullText:  "Hello world" 
    // regexMatches:  ["ld"] 
    return 'planet';   // 
  }
}]
 
// The new text will now be:  "Hello planet"

2、正則小記

/(version:")([0-9.]+)(")[\S\s]*(isDebug: true)/g

()將正則表示式的原子分成組,變成一個個大原子。當字串用正則表示式進行匹配時,這些原子匹配成功後都會成為匹配結果中的一個元素。
例如下面這段程式碼:

export function regText(){
	var str = "hello!";
	var reg = /(h)[\w]*(l)(\w)(!)/;
	var res = str.match(reg);
	console.log(res);
}

它的輸出就是下面這樣:

["hello!", "h", "l", "o", "!", index: 0, input: "hello!"]
0:"hello!"
1:"h"
2:"l"
3:"o"
4:"!"
index:0
input:"hello!"
length:5

具體需要如何操作,就可以根據情況去選擇元素了。