【问题标题】:RegEx - match all whitespaces (including line breaks) which are NOT the end of a preprocessor lineRegEx - 匹配不是预处理器行结尾的所有空格(包括换行符)
【发布时间】:2016-04-30 22:31:32
【问题描述】:

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

我尝试了否定的lookbehind,但我只能想出无效的正则表达式(限定符和lookarounds似乎彼此不喜欢):

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

现在,我对 RegEx 还是很陌生,因此我在这里的知识已经接近尾声。有解决办法吗?不胜感激!

【问题讨论】:

    标签: java regex minify line-breaks removing-whitespace


    【解决方案1】:

    怎么样:

    ^((?!#).*?) *\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 是一个糟糕的选择。我强烈建议您寻找现有的、经过测试的代码缩小工具,这些工具实际上对它们正在做什么有一个概念。在源代码上使用正则表达式就像进入一个非常黑暗的房间,周围放着非常锋利的工具。在旱冰鞋上。

    【讨论】:

    • 非常感谢!我正在缩小 SQF 文件,而不是 Java 文件。这是在 Java 中实现的,我知道字符串中的空格,不用担心 :)。关键是要删除所有空格,包括换行符,除非它们是预处理器行的结尾。 “空格”是指包括换行在内的所有内容。抱歉,我不清楚,Java 将 \n 计入 \s
    • 一个空格和一个换行符各占一个字节,有什么大不了的?
    • 这是为了降低代码的可读性。我也在缩小变量名,所以基本上目标是在不引入“伪代码”的情况下混淆代码。
    • @jaySon 听起来很无用。一个简单的代码格式化程序将毫无问题地恢复可读格式。无论如何,请参阅修改后的答案。您可能需要事先将 \t 替换为空格。
    • @jaySon - 在多行模式下试试这个"^[^\\S\\r\\n]*(\\#.*\\r?\\n)|^[^\\S\\r\\n]+(?=\\#)|^\\s*\\r?\\n|\\r?\\n",替换为$1
    猜你喜欢
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 2011-12-18
    • 2016-07-22
    • 2017-05-21
    相关资源
    最近更新 更多