Проблема замены строки - PullRequest
1 голос
/ 02 апреля 2010

Я хочу предоставить шаблон для генератора кода, который я разрабатываю. Типичный образец для класса:

public ${class_type} ${class_name} extends ${super_class} implements ${interfaces} {

${class_body}

}

Проблема в том, что super_class пуст или имеет интерфейс. Я заменяю extends $ {super_class} пустой строкой. Но я получаю лишние пробелы. Таким образом, класс без super_class и интерфейсов в итоге выглядит так:

public class Foo    {  //see the extra spaces before {?

${class_body}

}

Я знаю, что могу заменить несколько пробелов на один, но есть ли лучший подход?

РЕДАКТИРОВАТЬ: Я получил несколько хороших ответов, но это не решение проблемы. Я не могу указать шаблон, пользователи будут устанавливать его. Иначе какой смысл? Что делать, если они хотели бы иметь:

public ${class_type} ${class_name} extends ${super_class} 
                                   implements ${interfaces} {

${class_body}

}

Полагаю, я всегда могу удалить все пробелы между extends ${super_class} и implements ${interfaces} когда один из них пуст. Это все еще не будет идеально, но будет лучше.

Ответы [ 6 ]

2 голосов
/ 02 апреля 2010

Два варианта:

Один : Изменить шаблон:

public ${class_type} ${class_name}${super_block}${interfaces_block} {
${class_body}
}

... и всегда заменяйте ${super_block} и ${interfaces_block} & mdash; либо с «extends SuperClass» (обратите внимание на пространство спереди, но не в конце), либо с пустой строкой. (Точно так же блок интерфейсов был бы "реализует Foo" [снова пробел спереди] или пробел.)

Два : при замене обязательно указывайте пробел на передней панели (отредактируйте: Амир предложил ). Но это будет сложно, когда вы будете иметь дело с несколькими блоками, такими как super и interface.

(Примечание: у вашего цитируемого шаблона есть два пробела после бита интерфейса перед открытием {, что усугубляет проблему.)

2 голосов
/ 02 апреля 2010

Включите предыдущий пробел в строку "extends $ {super_class}" и т. Д., Поэтому, когда вы вставите пустую строку, она вообще не будет содержать пробелов.

Редактировать: очевидно, вы должны удалить пробелы между строками в дополнение к вышеуказанному исправлению.

1 голос
/ 02 апреля 2010

Просто включите предыдущий пробел в шаблон замены, то есть _extends_${super_class} и _implements_${interfaces} можно заменить пустыми строками (я использовал подчеркивание, чтобы сделать его более явным).

...${class_name}_extends_${super_class}_implements_${interfaces}_{
                \_____________________/\_______________________/
                    optional               optional

Один из способов осмыслить проблему состоит в том, чтобы рассматривать пространство как то, что оно есть: разделитель. Аналогично, ваша проблема выглядит примерно так:

У вас есть A, B и C, которые могут появляться в этом порядке, за исключением того, что B и C являются необязательными. Вы хотите перечислить их как кортеж, то есть, окруженные ( и ), разделенные ,. То есть это все допустимые кортежи:

(A,B,C)
(A,B)
(A,C)
(A)

Теперь более очевидно, что вы можете прикрепить предыдущую запятую к B и C. Таким образом, кортежи состоят из 4 частей (A + ,B + ,C + ), причем средние два являются необязательными - таким образом, вы не получите никаких дополнительных разделителей.


Примечание: по причинам, которые включают более простое упрощение генерации кода, некоторые грамматики допускают конечные запятые в конце списка, как предложения переменной длины. Например, в Java это допустимый инициализатор массива:

int[] arr = new int[] { 1, 2, }
                            ^
                           perfectly okay!

Для этих видов грамматики более целесообразно вместо этого добавлять разделитель ПОСЛЕ каждой части. Вы можете сделать процесс генерации кода более сложным, чтобы он никогда не создавал запятую (возможно, потому что вам просто не нравится его видеть), но тот факт, что многие грамматики позволяют им как-то оправдывать использование этого упрощения "ярлык".

0 голосов
/ 30 апреля 2010

Хороший способ - написать ключевое слово с пустой строкой и поглотить пространство до следующего ключевого слова. Подпись метода будет:

void blankKeyword(String content, String keyword, String next);

Не должно быть слишком сложно писать.

0 голосов
/ 02 апреля 2010

Я бы добавил способ представления опций:

public ${class_type} ${class_name} [extends ${super_class} ][implements ${interfaces} ]{
    ${class_body}
}

Таким образом, вместо удаления пробелов, я бы даже не включал пробелы, если пользователь не указывает отношение наследования.

0 голосов
/ 02 апреля 2010

Если вам нужно более мощное решение, вы можете использовать существующий шаблонизатор , например скорость или freemarker .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...