Как в джаве вставить обратный слэш
Перейти к содержимому

Как в джаве вставить обратный слэш

  • автор:

Экранирование, специальные символы

Как мы уже видели, обратная косая черта \ используется для обозначения классов символов, например \d . Это специальный символ в регулярных выражениях (как и в обычных строках).

Есть и другие специальные символы, которые имеют особое значение в регулярном выражении. Они используются для более сложных поисковых конструкций. Вот полный перечень этих символов: [ ] \ ^ $ . | ? * + ( ) .

Не надо пытаться запомнить этот список: мы разберёмся с каждым из них по отдельности, и таким образом вы выучите их «автоматически».

Экранирование символов

Допустим, мы хотим найти буквально точку. Не «любой символ», а именно точку.

Чтобы использовать специальный символ как обычный, добавьте к нему обратную косую черту: \. .

Это называется «экранирование символа».

alert( "Глава 5.1".match(/\d\.\d/) ); // 5.1 (совпадение!) alert( "Глава 511".match(/\d\.\d/) ); // null ("\." - ищет обычную точку)

Круглые скобки также являются специальными символами, поэтому, если нам нужно использовать именно их, нужно указать \( . В приведённом ниже примере ищется строка «g()» :

alert( "function g()".match(/g\(\)/) ); // "g()"

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

alert( "1\\2".match(/\\/) ); // '\'

Косая черта

Символ косой черты ‘/’ , так называемый «слэш», не является специальным символом, но в JavaScript он используется для открытия и закрытия регулярного выражения: /. шаблон. / , поэтому мы должны экранировать его.

Вот как выглядит поиск самой косой черты ‘/’ :

alert( "/".match(/\//) ); // '/'

С другой стороны, если мы не используем короткую запись /. / , а создаём регулярное выражение, используя new RegExp , тогда нам не нужно экранировать косую черту:

alert( "/".match(new RegExp("/")) ); // находит /

new RegExp

Если мы создаём регулярное выражение с помощью new RegExp , то нам не нужно учитывать / , но нужно другое экранирование.

Например, такой поиск не работает:

let regexp = new RegExp("\d\.\d"); alert( "Глава 5.1".match(regexp) ); // null

Аналогичный поиск в примере выше с /\d\.\d/ вполне работал, почему же не работает new RegExp(«\d\.\d») ?

Причина в том, что символы обратной косой черты «съедаются» строкой. Как вы помните, обычные строки имеют свои специальные символы, такие как \n , и для экранирования используется обратная косая черта.

Вот как воспринимается строка «\d.\d»:

alert("\d\.\d"); // d.d

Строковые кавычки «съедают» символы обратной косой черты для себя, например:

  • \n – становится символом перевода строки,
  • \u1234 – становится символом Юникода с указанным номером,
  • …А когда нет особого значения: как например для \d или \z , обратная косая черта просто удаляется.

Таким образом, new RegExp получает строку без обратной косой черты. Вот почему поиск не работает!

Чтобы исправить это, нам нужно удвоить обратную косую черту, потому что строковые кавычки превращают \\ в \ :

let regStr = "\\d\\.\\d"; alert(regStr); // \d\.\d (теперь правильно) let regexp = new RegExp(regStr); alert( "Глава 5.1".match(regexp) ); // 5.1

Итого

  • Для поиска специальных символов [ ] \ ^ $ . | ? * + ( ) , нам нужно добавить перед ними \ («экранировать их»).
  • Нам также нужно экранировать / , если мы используем /. / (но не new RegExp ).
  • При передаче строки в new RegExp нужно удваивать обратную косую черту: \\ для экранирования специальных символов, потому что строковые кавычки «съедят» одну черту.

Java: Экранирующие последовательности

Мы хотим показать диалог Матери Драконов со своим ребенком:

- Are you hungry? - Aaaarrrgh! 

Если вывести на экран строку с таким текстом:

System.out.println("- Are you hungry?- Aaaarrrgh!"); 
- Are you hungry?- Aaaarrrgh!

Не то, что мы хотели. Строки расположены друг за другом, а не одна ниже другой. Нам нужно как-то сказать интерпретатору «нажать на Enter» — сделать перевод строки после вопросительного знака. Это можно сделать, используя символ перевода строки: \n :

System.out.println("- Are you hungry?\n- Aaaarrrgh!"); 
- Are you hungry? - Aaaarrrgh!

\n — это специальный символ. В литературе его часто обозначают как LF (Line Feed). Возможно, вы сейчас подумали, что это опечатка, ведь здесь мы видим два символа \ и n , но это не так. С точки зрения компьютера — это один невидимый символ перевода строки:

// Мы это не изучали, но вы должны знать правду // Ниже код, который возвращает длину строки "a".length(); // 1 "\n".length(); // 1 . "\n\n".length(); // 2 . 

Почему так сделано? \n — всего лишь способ записать символ перевода строки, но сам перевод строки по своему смыслу – это один символ, правда, невидимый.

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

Символ перевода строки не является чем-то специфичным для программирования. Все, кто хоть раз печатал на компьютере, использовал перевод строки, нажимая на Enter.

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

- Привет!¶ - О, привет!¶ - Как дела?

Устройство, которое выводит соответствующий текст, учитывает этот символ. Например, принтер при встрече с LF протаскивает бумагу вверх на одну строку, а текстовый редактор переносит весь последующий текст ниже, также на одну строку.

\n — это пример экранирующей последовательности (escape sequence). Их еще называют управляющими конструкциями. Хотя таких символов не один десяток, в программировании часто встречаются всего несколько.

Кроме перевода строки, к таким символам относятся:

  • Табуляция — разрыв, получаемый при нажатии на кнопку Tab
  • Возврат каретки (только в Windows)

Программистам часто нужно использовать перевод строки \n для правильного форматирования текста:

System.out.println("Gregor Clegane\nDunsen\nPolliver\nChiswyck"); 

На экран выведется:

Gregor Clegane Dunsen Polliver Chiswyck 

Обратите внимание на следующие моменты:

  1. Не имеет значения, что стоит перед или после \n : символ или пустая строка. Перевод будет обнаружен и выполнен в любом случае
  2. Помните, что строка может содержать один символ или вообще ноль символов. А еще строка может содержать только \n . Проанализируйте следующий пример:

System.out.println("\n"); System.out.println("Dunsen"); 

Здесь мы сначала выводим строку «перевод строки», а потом делаем вывод обыкновенной строки. Программа выведет на экран:

 
Dunsen

Почему перед строкой Dunsen появилось две пустые строки, а не одна? Дело в том, что System.out.println() при выводе значения автоматически добавляет в конец символ перевода строки. Таким образом, один перевод строки мы указали явно, передав этот символ экранирующей последовательности аргументом в функцию, а второй перевод строки добавлен самой функцией автоматически. Еще пример кода:

System.out.println("Polliver"); System.out.println("Gregor Clegane"); System.out.println(); System.out.println("Chiswyck\n"); System.out.println("Dunsen"); 

Вывод будет таким:

Polliver Gregor Clegane Chiswyck Dunsen 
System.out.println("Joffrey loves using \\n"); 

на экран выйдет:

Joffrey loves using \n 

Небольшое, но важное замечание про Windows. В Windows для перевода строк по умолчанию используется \r\n — это связано с историческими причинами. Такая комбинация хорошо работает только в Windows, но создает проблемы при переносе в другие системы: например, когда в команде разработчиков есть пользователи как Windows, так и Linux.

Дело в том, что последовательность \r\n имеет разную трактовку в зависимости от выбранной кодировки. Поэтому в среде разработчиков принято всегда использовать \n без \r , так как LF всегда трактуется одинаково и отлично работает в любой системе. Не забудьте настроить ваш редактор на использование \n .

Задание

Напишите программу, которая выводит на экран:

- Did Joffrey agree? - He did. He also said "I love using \n". 

При этом программа использует только один System.out.println() , но результат на экране должен выглядеть в точности как показано выше.

Упражнение не проходит проверку — что делать? ��

Если вы зашли в тупик, то самое время задать вопрос в «Обсуждениях». Как правильно задать вопрос:

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

В моей среде код работает, а здесь нет ��

Тесты устроены таким образом, что они проверяют решение разными способами и на разных данных. Часто решение работает с одними входными данными, но не работает с другими. Чтобы разобраться с этим моментом, изучите вкладку «Тесты» и внимательно посмотрите на вывод ошибок, в котором есть подсказки.

Мой код отличается от решения учителя ��

Это нормально ��, в программировании одну задачу можно выполнить множеством способов. Если ваш код прошел проверку, то он соответствует условиям задачи.

В редких случаях бывает, что решение подогнано под тесты, но это видно сразу.

Прочитал урок — ничего не понятно ��

Создавать обучающие материалы, понятные для всех без исключения, довольно сложно. Мы очень стараемся, но всегда есть что улучшать. Если вы встретили материал, который вам непонятен, опишите проблему в «Обсуждениях». Идеально, если вы сформулируете непонятные моменты в виде вопросов. Обычно нам нужно несколько дней для внесения правок.

Кстати, вы тоже можете участвовать в улучшении курсов: внизу есть ссылка на исходный код уроков, который можно править прямо из браузера.

Полезное

Как в джаве вставить обратный слэш

— Двойной слэш — это логично. А вот всё остальное сразу не запомню. Придётся пользоваться твоими подсказками.

— Постепенно запомнишь то, что нужно. Не переживай. А для остального есть Google.

Кодировка Unicode

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

— Когда-то давно, когда только изобрели компьютеры, для кодировки всех символов было достаточно семи бит (меньше одного байта) – первая кодировка содержала всего 128 символов. Называлась такая кодировка ASCII .

— Ничего странного. Это сокращение такое. ASCII (англ. American Standard Code for Information Interchange) — американская стандартная кодировочная таблица для печатных символов и некоторых специальных кодов.

— Она состояла из 33 непечатных управляющих символов (влияющих на обработку текста и пробелов) и 95 печатных символов, включая цифры, буквы латинского алфавита в строчном и прописном вариантах и ряд пунктуационных символов.

— Рост популярности компьютеров привел к тому, что каждая страна начала выпускать свою кодировку. Обычно за основу брали ASCII и заменяли редко используемые символы на символы национальных алфавитов.

— Со временем появилась идея: создать одну кодировку, в которой разместить все символы всех мировых кодировок.

— Так в 1993 году была создана кодировка Unicode , и язык Java был первым языком программирования, который использовал ее как стандарт хранения текста. Сейчас же Unicode — стандарт всей ИТ-индустрии.

— И хотя Unicode сам по себе является стандартом, у него есть несколько форм представления (Unicode transformation format, UTF): UTF-8, UTF-16 и UTF-32, и пр.

— В Java используется продвинутая разновидность кодировки Unicode – UTF-16: каждый символ в которой кодировался 16 битами (2 байтами). Она способна вместить до 65,536 символов! В этой кодировке можно найти почти все символы всех алфавитов мира.

— Я надеюсь, её не нужно знать наизусть?

— Ладно-ладно. Воспользуюсь правилом: “нельзя знать всё, но всё можно загуглить”.

— Рациональный подход — наше всё. Так вот, чтобы записать в коде программы символ кодировки Unicode по его коду, нужно написать \u + шестнадцатеричные цифры кода . Например \u00A9

 System.out.println("\u00A9 JavaRush");
© JavaRush

Экранирование символов в Java

Экранирование символов в Java - 1

Что-то пошло не так! Данная статья писалась как выполнение тестового задания на должность в команде JavaRush. И писалась как полноценная лекция. За счет этого гарантирую вам качество и количество полезных знаний скопившихся в этом посте. Помимо практической и теоретической информации, в статье присутствуют интересные факты, о которых вы могли даже не догадываться! Hello World! Экранирование символов — это очень интересное и необходимое техническое решение. Необходимость в экранировании символов сыграло важную роль в истории всей индустрии программирования. В этой статье мы поговорим о том, что такое экранирование символов, почему появилась потребность их экранировать, и как экранирование символов реализовано в Java. В статье будут приведены примеры и интересные факты, связанные с темой экранирования символов. Приятного чтения! Вся информация в компьютерной системе представлена в виде текста, который на более низком уровне представлен байтами. Когда мы пишем письмо или сообщение, мы набираем текст, который будет понятен для человека. Когда же мы пишем код в IDE, мы набираем текст, который сможет разобрать компилятор. В Java текст можно представить в виде типа String , для обозначения данных которого используются управляющие символы — парные кавычки.

 String str = "Hello World!"; 

С текстом “Hello World!” никаких проблем не возникает, но что если этот же текст необходимо выделить прямой речью? Воспользовавшись правилами грамматики становится ясно, что текст “Hello World!”, помимо управляющих символов от типа String , требуется поместить в кавычки прямой речи.

 String str = "Java said, "Hello World!""; 

Такой вариант будет нерабочим, т.к. компилятор попросту не поймет в какой же момент заканчивается инициализация переменной str . Для решения этой и подобных ей проблем было придумано экранировать символы , то есть менять управляющие символы на так называемые управляющие последовательности, известные также, как escape-последовательности . Ниже приведен список действующих escape-последовательностей java для использования в строках. \t — Символ табуляции (в java – эквивалент четырех пробелов); \b — Символ возврата в тексте на один шаг назад или удаление одного символа в строке (backspace); \n — Символ перехода на новую строку; \r — Символ возврата каретки; \f — Прогон страницы к началу следующей страницы; \’ — Символ одинарной кавычки; \» — Символ двойной кавычки; \\ — Символ обратной косой черты ( \ ). Теперь давайте выделим прямую речь в нашей фразе так, чтобы компилятор смог без проблем разобрать написанное.

 String str = "Java said, \"Hello World!\""; 

Таким образом, написанный текст понятен и компилятору и человеку, если содержимое переменной str вывести на экран. Мы разобрались с тем, что такое экранирование символов и для чего оно нужно. И даже экранировали символ двойной кавычки! Приступим к разбору оставшихся escape-последовательностей.

Экранирование символов в Java - 2

Символ табуляции в строке обозначается escape-последовательностью \t и является аналогом четырех пробелов. Однако, если длина строки, состоящая из четырех пробелов будет равна длине четырех символов, то длина строки с символом табуляции будет равна одному. Символ табуляции часто используется для построения таблиц или псевдографических элементов интерфейса, т.к. это удобнее записи четырех пробелов. Ниже пример псевдографического интерфейса. Среди всех escape-последовательностей символ \b пожалуй самый интересный, ведь он позволяет нам удалить последний символ в строке вывода, подобно, если бы мы стирали его нажатием клавиши backspace .

 System.out.print("2 + 2 = 5"); // На экране отображается 2 + 2 = 5 System.out.print("\b");// На экране отображается 2 + 2 = System.out.print("4");// На экране отображается 2 + 2 = 4 

Символы \n и \r имеют общую историю — рассмотрим их вместе. С символом переноса строки \n вы могли встречаться ранее. Например, если метод println() выводит информацию так, что следующий вывод будет с новой строки, то метод print() не выполняет переноса строки после вывода, но если добавить в конец вывода символ \n , то перенос строки будет выполнен.

 System.out.print("Следующий вывод будет с новой строки\n"); System.out.println("Следующий вывод будет с новой строки"); 

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

 System.out.print("Текст который необходимо переписать.");//На экране отображается "Текст который необходимо переписать." System.out.print('\r');//На экране пусто System.out.print("Новый текст.");//На экране отображается "Новый текст." 

Экранирование символов в Java - 3

На самом деле возврат каретки берет свое начало еще со времен, когда текст печатали на печатных машинках. Чтобы выполнить перенос строки, необходимо было передвинуть каретку и опустить рычажок (части механизма печатной машинки), после чего будет выполнен перенос строки. Если же рычажок не опустить, то можно было продолжать печатать в той же строке. Что мы и наблюдаем, выводя символ \r . В связи с этим, когда программист хотел выполнить перенос строки, он, по привычке, в конце вывода выполнял последовательность из символов \r\n . Когда эра печатных машинок подошла к концу, появилось поколение программистов, которые все еще использовали эту последовательность, хотя сами за печатной машинкой никогда не работали. Они часто забывали в каком порядке необходимо было выполнить данную последовательность — \r\n или \n\r . Тогда им на помощь пришло проверочное слово return , где наглядно виден порядок вывода этих символов. Однако позже при разработке программного обеспечения на первые версии Windows, после MS-DOS, программисты вынуждены были использовать последовательность \r\n . Сейчас же об этом можно не беспокоиться и для переноса строки использовать только символ \n . Вернемся еще раз в прошлое, примерно в 80-е годы. Именно тогда символ прогона страницы \f к началу следующей страницы имел популярность. В то время были большие линейные принтеры, для работы с которыми необходимо было писать программный код, содержащий что и как принтер должен напечатать. И для обозначения, что текст необходимо начать печатать с новой страницы использовался символ \f . В наше же время этот символ давно утратил свою актуальность, и навряд ли вы с ним когда-либо столкнетесь. Размеры линейного принтера весьма внушительны. С символами \’ и \\ все точно также как и с экранированием двойной кавычки, пример был в начале статьи. Экранировать одинарную кавычку придется, например, для инициализации типа char одинарной кавычкой.

 char ch = '\''; 

Экранировать символ обратной косой черты необходимо для указания, что последующий символ не будет являтся частью escape-последовательности.

 System.out.println("\\n - escape-последовательность переноса строки"); // Вывод: \n - escape-последовательность переноса строки 

На практике же экранировать обратный слеш чаще приходится при работе с путями:

 System.out.println("It's Java string: \"C:\\Program Files\\Java\\jdk1.7.0\\bin\""); // Вывод: It's Java string: "C:\Program Files\Java\jdk1.7.0\bin" 

Я подчеркнул, что данные escape-последовательности употребляются в строках (строковых литералах), т.к. остальная их часть используется для описания регулярных выражений класса Pattern и не относится к теме данной статьи. Здесь можно ознакомиться со списком всех escape-последовательностей класса Pattern . Однако, стоит отметить, что регулярные выражения в том виде, в котором они есть сейчас, невозможно представить без использования escape-последовательностей не только в java, но и в других популярных языках программирования, например, PHP. В java экранирование символов используется и в форматировании строк. Например, задавая формат строки для отображения символа процента, необходимо продублировать символ процента – %% , иначе получим ошибку, а IDE будет предлагать дописать процент.

 System.out.printf("Процент жирности молока : %d%%", 10); // Процент жирности молока : 10% 

На этом статья подходит концу. Надеюсь, вы узнали много нового об экранировании символов, и о том, как применять это на практике. Экранирование символов присуще многим языкам программирования. В java, как и в других си-подобных языках данная технология реализована почти одинаково. Поэтому, полученные вами знания из этой статьи вполне могут пригодится не только в java. Спасибо за внимание и удачи в обучении!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *