Java, экранирование (использование) кавычек в регулярном выражении - PullRequest
1 голос
/ 18 июня 2011

Я пытаюсь использовать следующее регулярное выражение в Java, которое должно соответствовать любому lang="2-char-lang-name":

String lang = "lang=\"" + L.detectLang(inputText) +"\"";
shovel.replaceFirst("lang=\"[..]\"", lang);

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

Другими словами, как я могу включить " в регулярное выражение? "lang=\\"[..]\\"" не будет работать. Я также пробовал три слэша, и у них тоже не было совпадений.

Мне также известно общее правило, согласно которому вы не используете регулярные выражения для анализа XML / HTML. (а shovel - это XML) Однако все, что я делаю, - это ищу атрибут lang, который находится в первых 30 символах XML, и я хочу его заменить. Это действительно плохая идея использовать регулярные выражения в этом случае? Я не думаю, что использование DOM было бы лучше / эффективнее.

Ответы [ 2 ]

5 голосов
/ 18 июня 2011

Три слеша будут правильными (\\ + \" становится \ + " = \").( Обновление : На самом деле, оказывается, что это даже не нужно. Кажется, работает и один слэш.) Проблема в том, что вы используете [..];[] символы означают «любой из присутствующих здесь символов» (поэтому [..] просто означает «любой символ»).

Бросьте [], и вы должны получить то, что хотите:

String ab = "foo=\"bar\" lang=\"AB\"";
String regex = "lang=\\\"..\\\"";
String cd = ab.replaceFirst(regex, "lang=\"CD\"");
System.out.println(cd);

Вывод:

foo="bar" lang="CD"
2 голосов
/ 18 июня 2011

Вы пробовали это с одной обратной косой чертой?Вывод

public static void main(String[] args) {
  String inputString = "<xml lang=\"the Queen's English\">";
  System.out.println(inputString.replaceFirst("lang=\"[^\"]*\"", "lang=\"American\"" ));
}

равен

<xml lang="American">

, который, если я правильно вас читаю, - это то, что вы хотите.

РЕДАКТИРОВАТЬ, чтобы добавить: причина aЕдинственная обратная косая черта работает так, что она на самом деле не является частью строки, это всего лишь часть синтаксиса для выражения строки.Длина строки "\"" равна 1, а не 2, а метод replaceFirst просто видит строку, содержащую " (без обратной косой черты).Вот почему, например, \s (класс символов пропусков в регулярном выражении) должен быть записан \\s в строковом литерале Java.

На мудрости использования регулярного выражения: это должно быть хорошо, если вы 'Вы уверены в формате файлов, которые вы обрабатываете.Если файлы могут содержать закомментированный заголовок, дополненный lang спецификацией над реальным заголовком, у вас могут возникнуть проблемы!

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