我想删除文件中所有不必要的空格,包括换行符,但前提是该换行符不是预处理器行的末尾。虽然文件的语言是 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 { };
我尝试使用负向后查找,但我只能想出无效的正则表达式(限定符和环视似乎彼此不喜欢):
(?<!(#[^\s]+\s+[^\s]+[^\n]*))[\s]
现在,我对正则表达式还很陌生,因此我对这里的知识几乎已经结束了。有解决办法吗?我将不胜感激!
最佳答案
怎么样:
^((?!#).*?) *\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 源代码)的输入,正则表达式是一个糟糕的选择。我强烈建议您寻找现有的、经过测试的代码压缩工具,这些工具实际上对它们正在做什么有一个概念。在源代码上使用正则表达式就像进入一个非常黑暗的房间,周围有非常锋利的工具。穿着溜冰鞋。
关于java - 正则表达式 - 匹配所有不是预处理器行末尾的空格(包括换行符),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34978644/