Всем привет, я Юпи, и сегодня я делюсь небольшими знаниями.
Моя последняя работа — разработка механизма синтаксического анализа SQL. Проще говоря, это преобразование строки выражения SQL в дерево объектов для выполнения ряда операций, таких как запросы.
В самом начале я столкнулся с очень головной болью,Операторы SQL, написанные пользователем, могут быть очень нестандартными!
Идеальный оператор SQL, с хорошим отступом, без лишних символов:
select * from user;
Реальность часто такова:
select * \n
from user;
Приведенные выше операторы не только имеют отступы и переносы строк, но также содержат много бессмысленных строк, таких как"\n"
!
Поэтому, если вы хотите разработать общий механизм синтаксического анализа SQL, вы должны сначала выполнитьпредварительная обработка, нормализуйте входной оператор SQL. Например, удалите возврат каретки, перевод строки, лишние пробелы и специальные символы.
Вопрос в том, как удалить все строки в строке"\n"
Шерстяная ткань? Обратите внимание, что здесь"\n"
не новая строка, а по характеру'\'
и персонажи'n'
состоит из струн!
# 转换前
select * \n
from user;
# 转换后
select * from user;
Сначала я подумал о двух идеях:
- Используйте оператор цикла для последовательного сканирования каждого символа и определения, является ли он текущим символом и следующим символом.
"\n"
, а затем удалить. - Предоставляется непосредственно на языке Java
replaceAll
метода, передать регулярное выражение и напрямую заменить все подстроки, соответствующие регулярному выражению в полной строке, пустой строкой.
Здесь я выбираю последнее, так удобнее использовать готовый метод напрямую, а с помощью мощных регулярных выражений можно заменить несколько лишних символов одновременно.
Определение регулярного выражения Java:
/*
* 全部替换
* regex 正则表达式
* replacement 要替换成的新串
*/
public String replaceAll(String regex, String replacement) {
return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}
Итак, как написать регулярное выражение, которое удаляет все"\n"
Шерстяная ткань? Вот я запустила опрос, вы можете сначала подумать сами и дать свой выбор.
Сначала мне показалось, что это слишком просто, поэтому я прямо написал следующий код:
str.replaceAll("\n", "");
В результате не получается плавно заменить строку в строке"\n"
, просто удалите разрывы строк!
Причина проста: в символьных константах Java обратная косая черта (\) — это специальный символ, называемыйуправляющий символ, его роль состоит в том, чтобы избежать следующего символа, что само по себе не имеет практического значения!
Следовательно, обратную косую черту нельзя вывести напрямую таким образом:
Если вы хотите вывести только обратную косую черту, вам нужно добавить обратную косую черту:
Точно так же, если вы хотите вывести"\n"
Строка, код должен быть написан так:
System.out.println("\\n")
Затем попробуйте это регулярное выражение:
str.replaceAll("\\n", "");
Результат неожиданный, и эффект такой же, как если бы использовалась только одна обратная косая черта! Просто удалите новые строки.
На самом деле, правильный ответ должен заключаться в использованиичетыре обратных слэша, потому что обратная косая черта является escape-символом как в Java, так и в регулярных выражениях!
Среди них первая косая черта — это escape-символ, вторая косая черта — это сама косая черта, третья косая черта — снова escape-символ, а четвертая косая черта — это сама косая черта.
В Java вывод"\n"
Для строк требуется две обратные косые черты и одна'n'
, в регулярном выражении Java необходимо назначить обратную косую черту каждой из двух обратных косых черт для выхода, чтобы они вступили в силу.
В общем, запомните одну фразу:В регулярных выражениях Java сопоставьте обратную косую черту с четырьмя обратными косыми чертами!
Наконец, регулярные выражения — большой вопрос.Я рекомендую онлайн-инструмент визуализации для изучения, создания и тестирования регулярных выражений, RegExr. Учитесь на практике, и вы сразу же приступите к работе!
Источник статьи:Билеты WeChat.QQ.com/Yes/RN D действительно 59UT…