2014-05-23 154 views
0

我有一個多行日誌文件,我試圖用正則表達式和JavaScript解析成更具可讀性的東西,我將這個問題用作參考,但得到意想不到的結果Javascript replace with reference to matched group?Javascript正則表達式匹配組

基本上b日誌「第一次」未定義「第二次」,我期望看到文件名作爲第二次匹配。

這是我試圖匹配哪個結果匹配的正則表達式和數據字符串的示例。 http://regex101.com/r/bW9xD4

我想命令匹配,以便文件名是第一次,其次是第一次匹配後第二次匹配,任何人都可以指向正確的方向嗎?

代碼

var VIRTUAL = (function() { 
    // Module globals 
    var $ = {}; 

    // Module methods 
    $ = { 
    compareDelivery : function(data) { 
     var regex = new RegExp('(\\d{2}:\\d{2}:\\d{2})|([0-9a-z]+.xml)', 'gmi'), out = []; 

     var found = data.replace(regex, function (a, b, c) { 
      console.log(a); 

     }); 

     return out; 
    } 

    }; 


    return $; 

}()); 

JSBIN:http://jsbin.com/manej/3/edit?js,console,output

+0

您在jsbin登錄'B',你要麼想記錄'a'或'b || c' –

+0

@PaulS。返回時間1,文件名,時間2我如何才能訪問文件名,然後訪問時間? c是未定義的,文件名,未定義 – KryptoniteDove

回答

1

KryptoniteDove,這個簡單的代碼將做到這一點(見online demo輸出):

<script> 
var subject = 'Time 2014-05-22T10:39:04.890117+01:00 Filename S140522DSS10002.xml::938c287eb522359b600f74bb3140bb64 Generated 2014-05-22T10:38:46.000000+01:00'; 
var regex = /Time.*?(\d{2}:\d{2}:\d{2}).*?([0-9a-z]*\.xml).*?(\d{2}:\d{2}:\d{2})/i; 
var match = regex.exec(subject); 
if (match != null) { 
     document.write(match[2] + "<br>"); 
     document.write(match[1] + "<br>"); 
     document.write(match[3] + "<br>"); 
} 
</script> 

這是如何工作的?

,而不是試圖多個匹配,我們有一個單一的正則表達式匹配的一切,捕捉文件的名稱和在捕捉組時代1,2和3

1

通過看你的數據,也許你可以使用一種模式是這樣而不是

"(Time .*?)\\s(Filename .*?)\\s(Generated [^\\n]*)" 

和replaceor

function ($0, time1, file, time2) { 
    // .. do stuff 
} 

您當前的方法不工作,因爲每個匹配都獨立於前一個;它發現它們的唯一原因是g標誌。按照我的建議,比賽立即找到所有組,並且g標誌將使它在多行中工作。

+0

謝謝保羅。有沒有辦法修改這個,以便它忽略日誌中的垃圾,並只給我匹配的數據,我可以閱讀正如我的正則表達式? – KryptoniteDove