2016-01-24 67 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