2016-01-24 3 views
2

Я хотел бы удалить все лишние пробелы в файле, включая разрывы строк, НО только если этот разрыв строки НЕ является концом препроцессорная линия. Команды препроцессора такие же, как в C, хотя язык файла SQF, но это не имеет значения в этом контексте. Я делаю это на Java, но по соображениям удобочитаемости я размещаю свое регулярное выражение здесь в простой форме, а не как строки Java.RegEx - соответствует всем пробелам (включая разрывы строк), которые НЕ являются концом строки препроцессора

Это пример того, что файл может выглядеть следующим образом:

#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 { }; 

После последнего препроцессора line, прерывание строки также удаляется. Но я хочу, чтобы остаться, я хочу, результат похож на это:

#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 { }; 

Я попробовал, что с отрицательным просмотром назад, но я только мог придумать недействительны регулярные выражения (quatifiers и 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 {}; 

BEWARE Это заменит пробелы в строковых литералов , Regex - плохой выбор для работы с входами со сложной вложенной грамматикой (например, исходный код Java). Я настоятельно рекомендую вам искать существующие проверенные инструменты для минимизации кода, которые фактически имеют представление о том, что они делают. Использование регулярного выражения в исходном коде похоже на вхождение в очень темную комнату с очень острыми инструментами. На роликах.

+0

спасибо! Я минимизирую файлы SQF, а не файлы Java. Реализация этого в Java, и я знаю, что пробелы внутри строки, не беспокойтесь :). Дело в том, что нужно удалить все пробелы, включая разрывы строк, если они не являются концом строки препроцессора. Под «пробелами» я подразумеваю все, включая разрывы строк. Извините, я не совсем понял, что Java считает '\ n' в' \ s'. – jaySon

+0

Пространство и новая линия занимают по одному байту, в чем же дело? – Tomalak

+0

Речь идет о том, чтобы сделать код менее читаемым. Я также уменьшаю имена переменных, поэтому в основном цель состоит в том, чтобы запутать код без введения «фиктивного кода». – jaySon