Необработанные строки в Java - для регулярных выражений, в частности - PullRequest
67 голосов
/ 10 августа 2009

Есть ли способ использовать необработанные строки в Java (без escape-последовательностей)?

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

Я понимаю, что язык не предоставляет этого напрямую, но есть ли способ каким-либо образом "имитировать" их?

Ответы [ 11 ]

47 голосов
/ 20 октября 2010

Это обходной путь, если вы используете затмение. Вы можете автоматически иметь длинные блоки текста, правильно многоточечные и специальные символы, автоматически экранированные при вставке текста в строковый литерал

"- вставь сюда-";

если вы включите эту опцию в окне → настройки → java → редактор → набор текста → «Экранировать текст при вставке в строковый литерал»

37 голосов
/ 10 августа 2009

Нет, нет.

Обычно вы помещаете необработанные строки и регулярные выражения в файл свойств, но они также имеют некоторые требования к escape-последовательности.

26 голосов
/ 20 апреля 2013

Я использую Pattern.quote . И это решает проблему вопроса. Thusly:

Pattern pattern = Pattern.compile(Pattern.quote("\r\n?|\n"));

Метод quote возвращает строку, которая соответствует предоставленному строковому аргументу, а возвращаемая строка является строкой в ​​правильном кавычке для нашего случая.

11 голосов
/ 10 августа 2009

Нет (довольно печально).

3 голосов
/ 23 февраля 2018

Примечание: на сегодняшний день недоступно. Вероятно, я буду редактировать этот ответ снова всякий раз, когда функция будет выпущена.

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

Пример 1: Строка регулярного выражения, закодированная как

  System.out.println("this".matches("\\w\\w\\w\\w"));

может быть альтернативно закодирован как

System.out.println("this".matches(`\w\w\w\w`));

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

Пример 2: Многострочный строковый литерал с добавлением иностранного языка.

A multiple line string that was coded as 
    String html = "<html>\n" +
                "    <body>\n" +
                "         <p>Hello World.</p>\n" +
                "    </body>\n" +
                "</html>\n";

может быть альтернативно закодирован как

 String html = `<html>
                       <body>
                           <p>Hello World.</p>
                       </body>
                   </html>
                  `;

, что устраняет необходимость в промежуточных кавычках, конкатенации и явных переводах строк.

Надеюсь, мы скоро увидим релиз.

3 голосов
/ 11 августа 2009

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

Да, есть способы обойти плохую читабельность. Вы можете попробовать:

String s = "crazy escaped garbage"; //readable version//

хотя это требует осторожности при обновлении. В Eclipse есть опция, которая позволяет вставлять текст между кавычками, и для вас применяются escape-последовательности. Тактика заключается в том, чтобы сначала отредактировать читаемые версии, а затем удалить мусор и вставить их между пустыми кавычками "".


Время идеи:

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

String s = "##########
#####";

где # - любой символ, который выделен - разрыв рассматривается как новая строка. Текст, набранный или вставленный в выделенную область, экранируется в «реальном» источнике и отображается так, как будто его нет. (Точно так же, как Eclipse экранирует вставленный текст, он будет экранировать напечатанный текст, а также отображать его без обратной косой черты.) Удалите одну из кавычек, чтобы вызвать синтаксическую ошибку, если вы хотите редактировать нормально. Хм.

3 голосов
/ 11 августа 2009

Имейте необработанный текстовый файл в вашем пути к классам и считывайте его с помощью getResourceAsStream (....)

2 голосов
/ 10 августа 2009

String # getBytes () предоставляет копию внутреннего байтового массива, содержащегося в каждом отдельном объекте String, который фактически содержит 16-битную строку в кодировке UTF-16 - массив байтов будет содержать ту же преобразованную строку соответствовать кодировке платформы по умолчанию. То, что я говорю, это то, что я думаю, что это настолько близко к «сырой» строке, насколько вы можете когда-либо получить в Java.

0 голосов
/ 16 июля 2014

Нет. Но есть плагин IntelliJ, который облегчает эту задачу, который называется String Manipulation .

IntelliJ также автоматически экранирует вставленную в него строку. (Как указывает @Dread , Eclipse имеет плагин для включения этого.)

0 голосов
/ 11 августа 2009

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

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

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

Второй вариант - создать файл, который будет предварительно обработан в интерфейсе Java; он может избежать регулярного выражения, как это делает. Лично я ненавижу генерацию кода, но если java-файл на 100% никогда не редактируется человеком, это не так уж плохо (реальное зло - генерируемые файлы, которые вы должны редактировать!)

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

Я предлагаю это только потому, что комментарии имеют произвольную форму, а вещи внутри тега "pre" довольно защищены от средств форматирования и других системных уродств. Доклет может извлечь это перед печатью javadoc и даже может добавить некоторые сгенерированные javadocs, указывающие на использование вами строк регулярных выражений.

Прежде, чем понизить голосование и сказать мне, что это глупая идея - я ЗНАЮ, я просто подумал, что я бы предложил это, потому что это интересно, но мое предпочтение, как я уже говорил выше, это простой текстовый файл ...

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