java - 正则表达式 - 匹配所有不是预处理器行末尾的空格(包括换行符)

标签 java regex minify line-breaks removing-whitespace

我想删除文件中所有不必要的空格,包括换行符,但前提是该换行符不是预处理器行的末尾。虽然文件的语言是 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/

相关文章:

正则表达式:分别捕获名称和部门

javascript - 使用正则表达式验证用户名

jquery - jquery.js 和 jquery.min.js 有什么区别?

angularjs - 缩小 Angular

java - 从ArrayList java中提取设定值下的项目

java - 正在调用 Servlet 的 service 和 init 方法,但没有调用 doGet

java - 在 Java 文本文件中使用字符串对数字进行排序

arrays - 多次迭代一个文件,每次查找一个正则表达式并返回一行(perl)

javascript - 如何正确缩小 angularJS 文件

java - Netbeans 7.1.2 JavaFX UnsatisfiedLinkError