Top.Mail.Ru
? ?
musya

Imageunv

unv, posts by tag: java - LiveJournal

Entries by tag: java

Парсинг JavaScript одним регулярным выражением
musya
Imageunv
Вот таким вот:
(?:(\s+)|(/\*[\s\S]*?(?:\*/|$))|(//[^\r\n]*(?:\r\n?|\n|$))|('(?:[^\\'\r\n]++|\\.)*(?:'|$))|("(?:[^\\"\r\n]++|\\.)*(?:"|$))|((?<=[!%&(*+,./:;<=>?\[{^|}~-]\s{0,16})/(?:[^\\\/\r\n]|\\.)*/\w*)|([!%&()*+,./:;<=>?\[\]{^|}~-])|(\b(?>with|while|volatile|void|var|typeof|try|true|transient|throws|throw|this|synchronized|switch|super|static|short|return|public|protected|private|package|null|new|native|long|interface|int|instanceof|in|import|implements|if|goto|function|for|float|finally|final|false|extends|export|enum|else|double|do|delete|default|debugger|continue|const|class|char|catch|case|byte|break|boolean|abstract)\b)|((?:\b[_A-Za-z]|\B\$)[_\$A-Za-z0-9]*)|(0x[0-9A-Fa-f]+)|((?:\b[0-9]+(?:\.[0-9]*)?|\B\.[0-9]+)(?:[Ee][+-]?[0-9]+)?))


Регулярное выражение выглядит устрашающе, неправда ли? :)
Хотя и не так страшно, как валидация e-mail адреса в формате RFC 822.

Пояснения и аналогичный одноRegExpовый парсер для XML под катомCollapse )

Ещё раз про машину Тьюринга и клавиатурные шаблоны
musya
Imageunv
В продолжение поста про добавление нового элемента в перечисление.

Все шаги за один раз:


Эвристики, рефакторинг и ДНФ
musya
Imageunv
Есть задача: имеется выборка из базы данных и нужно её красиво вывести пользователю, подсветив колонки разным образом в зависимости от их типа.
Сразу оговорюсь, что под типом подразумевается не физический тип (NUMBER, VARCHAR и т.п.), а назначение хранимых в колонке данных (в данном случае это будут первичные ключи различных таблиц).

Как правило, тип колонки в выборке можно определить по её имени, однако это не всегда получается.
Иногда колонка с одним и тем же именем используется в разных таблицах для представления разных данных. Причём т.к. мы имеем дело с произвольной выборкой, установить, из какой именно таблицы пришла колонка в общем случае невозможно (и даже если бы Oracle поддерживал ResultSetMetaData.getTableName(), значение колонки может быть банально значением арифметического выражения).

Продолжение под катомCollapse )

Клавиатурные шаблоны и машина Тьюринга
musya
Imageunv
С давних времён веду в своей программе на Java перечисления в таком стиле:

    public static final int NONE = 0, ACTION_ID = 1, ADAPTER_NAME = 2, ATTR_ACCESS_TYPE = 3;
    public static final int ATTR_GROUP_ID = 4, ATTR_ID = 5, ATTR_ID_LIST = 6, ATTR_SCHEMA_ID = 7;
    public static final int ATTR_TYPE_DEF_ID = 8, ATTR_TYPE_ID = 9, COMPONENT_ID = 10, CONNECTION_TYPE = 11;
    public static final int COST = 12, DATA = 13, DEF_VALUE = 14, DESCRIPTION = 15;
    public static final int FLAGS = 16, GRANTS = 17, HEIGHT = 18, ID = 19;
    public static final int KIND = 20, LISTENER_ID = 21, LIST_VALUE_ID = 22, MASK = 23;
    public static final int NAME = 24, OBJECT_ID = 25, OBJECT_TYPE_ID = 26, OPTIONS = 27;
    ...



Ну и так далее. Поскольку в Java до версии 1.5 не было явных перечислений, их приходится эмулировать int'овыми константами.
И я предпочитаю данные константы записывать по четыре на строчку, причём со сквозной сортировкой по имени (уверен, пуристы оценят :).

Самое сложное в такой организации перечисления - добавить новое значение (к примеру, DATE), точнее вставить его в нужное место в середине последовательности (с перестановкой хвостов на следующую строчку и перенумерацией всего стоящего после).
Всё хорошо, пока таких констант мало, но когда их число подходит к сотне, задача несколько усложняется. Тратить несколько минут на перенумерацию уже лень :)

Продолжение под катомCollapse )

i18n (internationalization) best practices
musya
Imageunv
Возможно, данный опыт пригодится тем из вас, кто сталкивался с локализацией.

Как вы знаете, при помощи java.text.MessageFormat можно строковую константу параметризовать значениями (как в случае с сишным sprintf, только с той разницей, что места для параметров обозначаются не %-последовательностями, а фигурными скобочками - {} - и в фигурных скобочках можно задавать кроме формата ещё и номер параметров, что есть значительный прогресс).

Т.е., к примеру, MessageFormat.format("{1} foo {0}", new Object[]{"123", "456"}) выдаст "456 foo 123" - и данная функциональность часто используется в неткрекеровских nc_resources'ах.

Однако что делать, если человек хочет написать "N сессий найдено", где N - параметр? Ведь в зависимости от N может меняться форма следующего за ним существительного. В английском языке будет как минимум две формы - "1 session found" и "X sessions found", где X <> 1. Можно бы забить в базу две константы для локализации. Но ведь в других языках могут быть другие правила для единственного/множественного чисел.

Продолжение под катомCollapse )

Image