2016-01-24 68 views
2

我想刪除文件中的所有不必要的空白,包括換行符結尾的所有空格(包括換行符),但前提是該行突破不是一個結束預處理器行。儘管文件的語言是SQF,但預處理器命令與C中的相同,但在此上下文中並不重要。我在Java中做這些東西,但出於可讀性的原因,我將這個正則表達式放在這裏,而不是Java字符串。正則表達式 - 匹配這不是一個預處理線

這是一個什麼樣的文件可能看起來像一個例子:

#include "someFile.ext" 
#define IDD    idd_interact 
#define ELEMENTS_COUNT 2 

#define FRAME_X   ((1 - FRAME_W)/2) 
#define FRAME_Y   ((1 - FRAME_H)/2) 

_aNumber = 0; 

if (_someVar == someGlobalVar) then { 

}; 

我這一個嘗試過:\\s+(?!#)但結果是這樣的:

#include "someFile.ext" 
#define IDD idd_interact 
#define ELEMENTS_COUNT 2 
#define FRAME_X ((1 - FRAME_W)/2) 
#define FRAME_Y ((1 - FRAME_H)/2) _aNumber = 0; if (_someVar == someGlobalVar) then { }; 

最後一個預處理後行,換行符也被刪除。但我想,要留,我想結果看起來像這樣:

#include "someFile.ext" 
#define IDD idd_interact 
#define ELEMENTS_COUNT 2 
#define FRAME_X ((1 - FRAME_W)/2) 
#define FRAME_Y ((1 - FRAME_H)/2) 
_aNumber = 0; if (_someVar == someGlobalVar) then { }; 

我試過用負回顧後,但我只能拿出無效正則表達式(表量和lookarounds似乎並不喜歡對方其他):

(?<!(#[^\s]+\s+[^\s]+[^\n]*))[\s] 

現在,我仍然是相當新的正則表達式,所以我幾乎在我的知識結束了。有沒有解決方案?我會非常感激!

回答

3

如何:

^((?!#).*?) *\n\s*| +$| +() 

,這將給你這個,全球更換時,在多行模式,與\1\2

#include "someFile.ext" 
#define IDD idd_interact 
#define ELEMENTS_COUNT 2 
#define FRAME_X ((1 - FRAME_W)/2) 
#define FRAME_Y ((1 - FRAME_H)/2) 
_aNumber = 0;if (_someVar == someGlobalVar) then {}; 

當心這將替換在字符串中的空白。使用複雜的嵌套語法處理輸入(如Java源代碼)時,Regex是一個糟糕的選擇。我強烈建議您尋找現有的經過測試的代碼縮小工具,它們實際上具有他們正在做的事情的概念。在源代碼中使用正則表達式就像進入一個非常黑暗的房間,周圍有非常尖銳的工具。在溜冰鞋上。

+0

非常感謝您!我正在縮小SQF文件,而不是Java文件。這是Java的實現,我知道字符串內部的空格,不用擔心:)。重點是刪除所有空格,包括換行符,除非它們是預處理器行的結尾。 「空格」是指包括換行符在內的所有內容。對不起,我不清楚,Java計算'\ n'到'\ s'中。 – jaySon

+0

一個空格和換行各佔據一個字節,有什麼大不了的? – Tomalak

+0

這是關於使代碼不易讀。我也在縮小變量名稱,所以基本上目標是在不引入「虛擬代碼」的情況下對代碼進行混淆。 – jaySon