Как удалить "\n" в строке? 80% одноклассников ошибаются!

внешний интерфейс
Как удалить "\n" в строке? 80% одноклассников ошибаются!

Всем привет, я Юпи, и сегодня я делюсь небольшими знаниями.

Моя последняя работа — разработка механизма синтаксического анализа SQL. Проще говоря, это преобразование строки выражения SQL в дерево объектов для выполнения ряда операций, таких как запросы.

SQL 解析原理

В самом начале я столкнулся с очень головной болью,Операторы SQL, написанные пользователем, могут быть очень нестандартными!

Идеальный оператор SQL, с хорошим отступом, без лишних символов:

select * from user;

Реальность часто такова:

 select * \n
from   user;

Приведенные выше операторы не только имеют отступы и переносы строк, но также содержат много бессмысленных строк, таких как"\n"!

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

Вопрос в том, как удалить все строки в строке"\n"Шерстяная ткань? Обратите внимание, что здесь"\n" не новая строка, а по характеру'\'и персонажи'n'состоит из струн!

# 转换前
select * \n 
from user;

# 转换后
select * from user;

Сначала я подумал о двух идеях:

  1. Используйте оператор цикла для последовательного сканирования каждого символа и определения, является ли он текущим символом и следующим символом."\n", а затем удалить.
  2. Предоставляется непосредственно на языке JavareplaceAllметода, передать регулярное выражение и напрямую заменить все подстроки, соответствующие регулярному выражению в полной строке, пустой строкой.

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

Определение регулярного выражения 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…