2017-01-23 39 views
1

我想要的文件的內容分割成一定大小的塊(比如40000個字符,包括空格和什麼,而不是)獲取匹配的正則表達式多行

但我有分裂數組時,有換行也是一種不必要的行爲。

 var files = $('#upload').get(0).files; 
     if (files.length > 0) { 
      var reader = new FileReader() 
      reader.onloadend = function() { 
       var content = reader.result 
       var buffer = 40000 
       var contentList = content.match(new RegExp('.{1,' + buffer + '}', 'gm')) 
       console.info('list : ', contentList) 
      } 
      reader.readAsBinaryString(files[0]) 
     } 

一個額外的問題,我可以看到,有沒有在文件中新行的跡象已讀,雖然有明確的文件中的多行。偶爾會錯過\n之類的東西。

+0

可能[正則表達式的Javascript多標誌不工作(的副本http://stackoverflow.com/questions/1068280/JavaScript的正則表達式,多標誌-犯規工作);當使用'[\ s \ S]'而不是'.'時會發生什麼? – apsillers

+0

@apsillers:如何將'[/ s/S]'翻譯成我的RegExp? –

+0

'new RegExp('[\\ s \\ S] {1,'+ buffer +'}','gm')'我想。 – apsillers

回答

1

更新:我只是看着XRegExp庫不支持拍攝換行符是什麼,這是非常簡單的:它只是替換所有.字符(匹配除了換行這一切)與字符類[\s\S],它匹配所有人物時期。這是有效的,因爲\s匹配一組特定的空白字符,並且\S(首字母)匹配\s的完全相反。採取兩者的結合,並且沒有不匹配的字符。所以,@apsillers的建議是完全正確的:用[\s\S]替換你的點以匹配任何字符。


什麼你正在尋找被稱爲 「單行模式」,不幸的是,JavaScript不支持它:

幾個選項:

  1. 正如該博客中的建議,您可以使用XRegExp庫。

  2. ,你可以嘗試用Unicode代碼點你一定在你的數據不會出現更換新行,然後做正則表達式匹配後替換回:

    var input = ...; 
    
    var inputSingleLine = input.replace(/\n/g, "\u27BF"); 
    
    var contentList = inputSingleLine.match(new RegExp('.{1,' + buffer + '}', 'gm')); 
    
    for (var index = 0; index < contentList.length; index++) 
        contentList[index] = contentList[index].replace(/\u27BF/g, "\n"); 
    
    console.info('list : ', contentList); 
    

    (假設你可以得到整個文件,包括所有的換行,到一個單一的變量,你開始匹配之前)