Могу ли я определить собственные сокращения класса символов? - PullRequest
11 голосов
/ 21 июля 2011

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

Ответы [ 4 ]

12 голосов
/ 21 июля 2011

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

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

Лично, когда у меня есть (немного) сложное регулярное выражение, я разбиваю регулярное выражение на более мелкие суб-регулярные выражения и затем "склеиваю" их вместе с 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, и если вы сделаете это таким образом, шаблон следует поместить вне метода и предварительно -compiled.

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

4 голосов
/ 21 июля 2011

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

0 голосов
/ 21 июля 2011

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

0 голосов
/ 21 июля 2011

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

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

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