Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 正则表达式-匹配不是预处理器行结尾的所有空白(包括换行符)_Java_Regex_Minify_Line Breaks_Removing Whitespace - Fatal编程技术网

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

Java 正则表达式-匹配不是预处理器行结尾的所有空白(包括换行符),java,regex,minify,line-breaks,removing-whitespace,Java,Regex,Minify,Line Breaks,Removing Whitespace,我想删除文件中所有不必要的空白,包括换行符,但前提是该换行符不是预处理器行的结尾。预处理器命令与C中的命令相同,尽管文件的语言是SQF,但在本上下文中这并不重要。我用Java做这件事,但出于可读性的原因,我把我的正则表达式放在这里,用普通格式,而不是Java字符串 这是一个文件外观的示例: #include "someFile.ext" #define IDD idd_interact #define ELEMENTS_COUNT 2 #define FRAME_X

我想删除文件中所有不必要的空白,包括换行符,但前提是该换行符不是预处理器行的结尾。预处理器命令与C中的命令相同,尽管文件的语言是SQF,但在本上下文中这并不重要。我用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 { }; 
我尝试了一个否定的lookbehind,但我只能得到无效的正则表达式(quatifiers和lookarounds似乎不喜欢对方):

(?
现在,我对RegEx还是相当陌生,因此我在这里的知识已经不多了。有什么解决办法吗?我非常感谢!

怎么样:

^((?!#).*?) *\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是一个糟糕的选择。我强烈建议您寻找现有的、经过测试的代码精简工具,这些工具实际上对它们的工作有一个概念。在源代码上使用regex就像走进一个非常黑暗的房间,里面放着非常锋利的工具。穿着溜冰鞋。

非常感谢!我正在精简SQF文件,而不是Java文件。这一功能的实现在Jav中我知道字符串中有空格,不用担心:)。但关键是要删除所有空白,包括换行符,除非它们是预处理器行的结尾。我所说的“空白”是指一切,包括换行符。抱歉,我不清楚,Java将
\n
计算为
\s
。一个空格和一个换行符各占一个字节,有什么大不了的?这是为了降低代码的可读性。我还缩小了变量名,因此基本上目标是在不引入“伪代码”的情况下混淆代码。@jaySon听起来相当徒劳。一个简单的代码格式化程序可以毫无问题地恢复可读的格式。无论如何,请参阅修改后的答案。您可能需要事先用空格替换
\t
。@jaySon-试试这个
“^[^\\S\\r\\n]*(\\\\\\\\\.\\r?\\n)\\\^[^\\S\\r\\n]+(?=\\\\\\\\\\\\\\\\\\\r\\n”
在多行模式下,替换为
$1
#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 {};