Могу ли я определить пользовательские сокращенные классы символов?

Java предоставляет некоторые полезные классы символов, такие как \d и \w. Могу ли я определить свои собственные классы символов? Например, было бы полезно уметь определять сокращения для классов символов, таких как [A-Za-z_].

Ответ 1

Могу ли я определить свои собственные классы символов?

Нет, вы не можете.

Лично, когда у меня есть (слегка) сложное регулярное выражение, я разбиваю регулярное выражение на меньшие подреггексы, а затем "склеиваю" их вместе с String.format(...) следующим образом:

public static boolean isValidIP4(String address) {
    String block_0_255 = "(0|[1-9]\\d|2[0-4]\\d|25[0-5])";
    String regex = String.format(
            "%s(\\.%s){3}", 
            block_0_255, block_0_255
    );
    return address.matches(regex);
}

который является более читаемым, чем один шаблон:

"(0|[1-9]\\d|2[0-4]\\d|25[0-5])(\\.(0|[1-9]\\d|2[0-4]\\d|25[0-5])){3}"

Обратите внимание, что это просто быстрый пример: проверка правильности IP-адресов может быть лучше выполнена классом из пакета java.net, и если вы сделаете это так, шаблон должен быть помещен вне метода и pre -compiled.

Будьте осторожны с знаками % внутри вашего шаблона!

Ответ 2

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

Ответ 3

Да и нет. Да, потому что [] уже является символьным классом. Нет, вы не можете определить пользовательские "ярлыки", например, \w. Одна из причин заключается в том, что это никогда не было решением JAVAs. Эти классы символов стандартизированы где-то в другом месте (POSIX?).

Мои 2 цента: регулярные выражения достаточно сложны. Вы не должны путать себя и других, введя еще больше.

Ответ 4

Я предполагаю, что вы говорите об использовании этих пользовательских ярлыков в регулярных выражениях? Если это так, ответ будет отрицательным, если вы не напишете собственный парсер регулярных выражений (который вы не хотите делать). Эти ярлыки являются частью предопределенной спецификации, которая не может быть изменена.