2012-01-11 91 views
1

我試圖在Windows上爲LESS預處理器實現用Sublime Text 2構建系統的錯誤捕獲。我需要一個包含路徑和錯誤行號的文件名分組的正則表達式。用於崇高文本分組的正則表達式(rexep)2構建系統

預處理器輸出如下:

ERR: 
    type: Parse 
    message: Syntax Error on line 6 
    index: 131 
    filename: D:\workflow\less-css\test\test.less 
    line: 6 
    extract: asd,}, 
[Finished] 

這裏是file_regex選項的正則表達式規則:

的file_regex選項使用Perl樣式的正則表達式來捕獲多達四個字段來自構建程序輸出的錯誤信息,即:文件名,行號,列號和錯誤消息。使用模式中的組來捕獲這些信息。文件名字段和行號字段是必需的。

我只是最近纔開始學習正則表達式,所以任何幫助,非常感激。同樣,regexp應該返回2個組項 - 文件名與路徑和行號。兩者都存在於預處理器輸出中。

感謝, 斯特凡

回答

1

我希望捕獲不必在你desccribe順序?這將捕獲該消息,文件名和行號到緩衝器1,2和3

/message:\s+(.+?)\s*\n.*filename:\s+(.+?)\s*\n.*line:\s+(.+?)\s*\n/s 

給定上述例子的錯誤,則捕獲將是

1: Syntax Error on line 6 
2: D:\workflow\less-css\test\test.less 
3: 6 

或者,使用向前斷言,以下PHP代碼存儲在正確的順序

<?php 
$err = ' 
ERR: 
    type: Parse 
    message: Syntax Error on line 6 
    index: 131 
    filename: D:\workflow\less-css\test\test.less 
    line: 6 
    extract: asd,}, 
'; 
$re = '/(?=.*filename:\s+(.+?)\s*\n)(?=.*line:\s+(.+?)\s*\n)()(?=.*message:\s+(.+?)\s*\n)/s'; 
preg_match($re, $err, $match); 
print_r($match); 
?> 

請注意,我已經插入一個空捕獲作爲列號的佔位符的東西。如果'index'標籤的值是列號,那麼只需複製其他字段捕獲並更改文本。

輸出

Array 
(
    [0] => 
    [1] => D:\workflow\less-css\test\test.less 
    [2] => 6 
    [3] => 
    [4] => Syntax Error on line 6 
) 
+0

它發生,我認爲'index'可能是列數。希望你可以擴展正則表達式來包含這個字段,如果需要的話?除了標籤文本外,每個字段的模式都是相同的。 – Borodin 2012-01-11 02:47:35

+0

不幸的是,訂單很重要。我想我現在不得不放棄錯誤信息。文件路徑和行號就足夠了。另外,你能否告訴我如何正確地逃避這個表情?它被分配給配置變量,所以python的原始輸出是不可能的。 – stefanlous 2012-01-11 11:04:03

+0

如果你的正則表達式的實現允許前瞻斷言,那麼這個'/(?=.*filename:\s+(.+?)\s*\n)(?=.*line:\s+(.+?)(#)(#)(#)(#)(#) \ s * \ n)(?=。*消息:\ s +(。+?)\ s * \ n)/ s'將以正確的順序返回字段。加倍所有反斜槓就足以逃避表達。 – Borodin 2012-01-11 14:52:01