Шаблоны Java Regexp имеют двойную обратную косую черту, как хранить шаблоны в читаемом формате - PullRequest
5 голосов
/ 17 апреля 2010

Было бы здорово иметь удобный способ хранения паттернов с одной обратной косой чертой. Некоторые обходные пути: сохраните его в файле и используйте NIO для чтения. Минусы: Java EE не разрешает доступ к IO. Хранить как-нибудь в JNDI. Может быть, новый для Java 5 Pattern.LITERAL флаг может помочь? Я хочу работать с обычной строкой шаблона, например \d, а не \\d.

Ответы [ 3 ]

6 голосов
/ 17 апреля 2010

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

например String s = "\t";

вы не можете использовать это для произвольных символов, хотя, String s = "\a"; даст вам ошибку во время компиляции. допустимые символы b, t, n, f, r, ", 'и \

поэтому, чтобы получить литерал \ в строке в java, вам нужно экранировать его следующим образом: \\. из-за этого ваша опция only не должна содержать эти строки в java-файлах, следовательно, во внешнем файле, который загружается вашим java-файлом. Pattern.LITERAL совсем не поможет, потому что вам все еще нужна правильная строка Java, а \d - нет.

1 голос
/ 05 мая 2011

Если вы заинтересованы в чтении выражений из файла, рассмотрите возможность упаковки файла в банку и используйте Class.getResourceAsStream(...). AFAIK, это все еще разрешено в Java EE.

0 голосов
/ 05 мая 2011

Если вы работаете только на Java, советую не переживать по этому поводу. Просто сохраните регулярное выражение так, как его может понять Java, то есть с раздражающим двойным \.

ЕСЛИ И ТОЛЬКО ЕСЛИ вы хотите сохранить регулярное выражение для использования их в качестве файла ввода для разных языков, а затем создать текстовый файл, используя стандартную запись регулярного выражения. Но тогда вам нужно будет создать какой-то класс, который будет использовать символ при чтении символа и сам позаботится о экранирующих символах, прежде чем добавлять их в строку, которая будет использоваться в сопоставителе шаблонов.

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

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

PS: только что заметил, что здесь вы должны убежать от \, чтобы сделать его видимым ... это странно ...

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