Большинство современных языков программирования и текстовых редакторов (по моему личному мнению) поддерживают регулярные выражения. Поддержим их и мы.
/Быть или не быть/ugi ¶
Синтаксис регулярных выражений прост и логичен. Он разделяется на символ-разделитель (он идёт в начале и конце выражения, обычно это /), шаблон поиска и необязательные модификаторы.
Формальный синтаксис такой:
[разделитель][шаблон][разделитель][модификаторы]
Разделителем может быть любой символ, но обычно это / или ~ . Важно лишь то, чтобы шаблон начинался и заканчивался одним и тем же разделителем. В самом конце регулярных выражений идут модификаторы, которые нужны, чтобы менять логику работы шаблонов (например делать регистронезависимый поиск).
Давайте разберём выражение /Быть или не быть/ugi :
/ — начальный символ-разделитель Быть или не быть — шаблон поиска / — конечный символ-разделитель ugi — модификаторы (UTF-8, global, case insensitive)
Данное регулярное выражение будет искать текст Быть или не быть не зависимо от регистра по всему тексту неограниченное количество раз. Модификатор u нужен для того, чтобы явно указать, что текст у нас в юникоде, то есть содержит символы, отличные от латиницы. Модификатор i включает регистронезависимый поиск. Модификатор g указывает поисковику идти до победного конца, иначе он остановится после первого удачного совпадения.
Порядок выполнения действий в выражениях. Числовые выражения
«Петя любит Дашу».replace(/Дашу|Машу|Сашу/, «Катю») ¶
Не трудно догадаться, что результатом работы js-выражения выше будет текст «Петя любит Катю» . Даже, если Петя неровно дышит к Маше или Саше, то результат всё равно не изменится.
Рассмотрим базовые спец. символы, которые можно использовать в шаблонах:
| Символ экранирования или начала мета-символа | /путь/к/папке/ | Надёт текст путь/к/папке | |
| ^ | Признак начала строки | /^Дом/ | Найдёт все строки, которые начинаются на Дом |
| $ | Признак конца строки | /родной$/ | Найдёт все строки, которые заканчиваются на родной |
| . | Точка означает любой символ, кроме перевода строки | /Петя ..бит Машу/ | Найдёт как Петя любит Машу , так и Петя губит Машу |
| | | Означает ИЛИ | /Вася|Петя/ | Найдёт как Васю, так и Петю |
| ? | Означает НОЛЬ или ОДИН раз | /Вжу?х/ | Найдёт Вжх и Вжух |
| * | Означает НОЛЬ или МНОГО раз | /Вжу*х/ | Найдёт Вжх , Вжух , Вжуух , Вжууух и т.д. |
| + | Означает ОДИН или МНОГО раз | /Вжу+х/ | Найдёт Вжух , Вжуух , Вжууух и т.д. |
Пишу программу в машинных кодах
Помимо базовых спец. символов есть мета-символы (или мета-последовательности), которые заменяют группы символов:
Нужно отметить, что спец. символы w, W, b и B не работают по умолчанию с юникодом (включая кириллицу). Для их правильной работы нужно указывать модификатор u . К сожалению, на окончание 2019 года JavaScript не поддерживает регулярные выражения для юникода даже с модификатором, поэтому в js эти мета-символы работают только для латиницы.
Ещё регулярные выражения поддерживают разные виды скобочек:
| (. ) | Круглые скобки означают под-шаблон, который идёт в результат поиска | /(Петя|Вася|Саша) любит Машу/ | Найдёт всю строку и запишет воздыхателя Маши в результат поиска под номером 1 |
| (. ) | Круглые скобки с вопросом и двоеточием означают под-шаблон, который НЕ идёт в результат поиска | /(?:Петя|Вася|Саша) любит Машу/ | Найдёт только полную строку, воздыхатель останется инкогнито |
| (?P. ) | Задаёт имя под-шаблона | /(?PПетя|Вася|Саша) любит Машу/ | Найдёт полную строку, а воздыхателя запишет в результат под индексом 1 и ‘воздыхатель’ |
| [abc] | Квадратные скобки задают ЛЮБОЙ СИМВОЛ из последовательности (включая спец. символы w, d, s и т.д.) | /^[123]+$/ | Соответствует любому выражению 323323123 , но не 54321 |
| [a-я0-9] | Если внутри квадратных скобок указать минус, то это считается диапазоном | /[A-Za-zА-Яа-яЁё0-9_]+/ | Аналог /w/ui для JavaScript |
| [abc-] | Если минус является первым или последним символом диапазона, то это просто минус | /[0-9+-]+/ | Найдёт любое целое числое с плюсом или минусом (причём не обязательно, чтобы минус или плюс были спереди) |
| [^. ] | Квадратные скобки с «крышечекой» означают любой символ НЕ входящий в диапазон | /[^a-zа-я0-9 ]/i | Найдёт любой символ, который не является буквой, числом или пробелом |
| [[:class:]] | Квадратные скобки в квадратных скобках задают класс символов (alnum, alpha, ascii, digit, print, space, punct и другие) | /[^[:print:]]+/ | Найдёт последовательность непечатаемых символов |
| Фигурные скобки с одним числом задают точное количество символов | /w+нw+/u | Найдёт слово, в котором две буквы н | |
| Фигурные скобки с двумя числами задают количество символов от n до k | /w+нw+/u | Найдёт слово, в котором есть одна или две буквы н | |
| Фигурные скобки с одним числом и запятой задают количество символов от n до бесконечности | /w+нw+/u | Найдёт слово, в котором н встречается от трёх и более раз подряд |
Как правильно писать регулярные выражения ¶
Прежде, чем садиться и писать регулярно выраженного кракена, подумайте, что именно вы хотите сделать. Регулярное выражение должно начинаться с мысли «Я хочу найти/заменить/удалить то-то и то-то». Затем вам нужен исходный текст, который содержит как ПРАВИЛЬНЫЕ, так и НЕправильные данные. Затем вы открываете https://regex101.com/, вставляете текст и начинаете писать регулярное выражение. Этот замечательный инструмент укажет и покажет все ошибки, а также подсветит результаты поиска.
Для примера возьмём валидацию ip-адреса. Первая мысль должна быть: «Я хочу валидировать ip-адрес. А что такое ip-адрес? Из чего он состоит?». Затем нужен список валидных и невалидных адресов:
# Валидные адреса 0.0.0.0 0.1.2.3 99.99.99.99 199.199.199.199 255.255.255.255 # Невалидные адреса 01.01.01.01 .1.2.3 1.2.3. 255.0.0.256
Валидный адрес должен содержать четыре числа (байта) от 0 до 255. Если он содержит число больше 255, это уже ошибка. Если бы мы делали валидацию на каком-либо языке программирования, то можно было бы разбить выражение на четыре части и проверить каждое число отдельно.
Но регулярные выражения не поддерживают проверки больше или меньше, поэтому придётся делать по-другому.
Для начала упростим задачу: будем валидировать не весь ip-адрес, а только один байт. А байт это всегда есть либо одно-, либо дву-, либо трёхзначное число. Для одно- и двузначного числа шаблон очень простой — любая цифра. А вот для трёхзначного числа первая цифра либо единица, либо двойка. Если первая цифра единица, то вторая и третья могут быть от нуля до девяти.
Если же первая цифра двойка, то вторая может быть только от нуля до пяти. Если первая цифра двойка и вторая пятёрка, то третья может быть только от ноля до пяти. Давайте формализуем:
# Валидация байта от 0 до 9 d от 10 до 99 [1-9]d от 100 до 199 1dd от 200 до 249 2[0-4]d от 250 до 255 25[0-5]
Теперь, зная все диапазоны байта, можно объединить их в одно выражение через вертикальную палочку | (ИЛИ):
b(d|[1-9]d|1dd|2[0-4]d|25[0-5])b
Обратите внимание, что я использовал границу слова b, чтобы искать полные байты. Пробуем регулярку в деле:

Как видим, все байты стали зелёненькими. Это значит, что мы на верном пути.
Осталось дело за малым: сделать так, чтобы искать четыре байта, а не один. Нужно учесть, что байты разделены тремя точками. То есть мы ищем три байта с точкой на конце и один без точки:
(b(d|[1-9]d|1dd|2[0-4]d|25[0-5])b.)b(d|[1-9]d|1dd|2[0-4]d|25[0-5])b
Результат выглядит так:

Подсветились только валидные ip-адреса, значит регулярное выражение работает корректно.
Если бы я сразу начал писать валидацию всего адреса, а не отдельного байта, то с большой долей вероятности допустил бы ошибку. Скопления скобочек, палочек и точечек трудно воспринимаются на глаз, поэтому задачу надо обязательно упрощать.
Практическое применение регулярных выражений ¶
Регулярными выражениями можно пользоваться не только для валидации, но и для обработки данных, например, в блокноте. Вот практический пример такой обработки: скопировать номера регионов и перевести в формат PHP-массива.
Your browser does not support HTML5 video.
Ссылки ¶
- https://regex101.com/ — сайт для тестирования регулярных выражений.
- https://linux.die.net/man/1/perlre — руководство по регулярным выражениям Perl.
- https://www.php.net/manual/ru/reference.pcre.pattern.syntax.php — регулярные выражения в PHP.
- https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/RegExp — регулярные выражения JavaScript.
Источник: anton-pribora.ru
Выражения и инструкции
Делим весь код на две группы — одна возвращает значения, другая — нет.
Время чтения: 6 мин
Открыть/закрыть навигацию по статье
Контрибьюторы:
Обновлено 4 декабря 2022
Кратко
Скопировать ссылку «Кратко» Скопировано
Выражение (англ. expression) — это код, который после выполнения возвращает какое-либо значение. Например, 5 + 3 вернёт 8 , а Math . random ( ) — случайное число.
Инструкция (англ. statement) — это отдельная команда в коде, которая выполняет определённое действие. Например, if позволяет создать ветвление в программе, for позволяет повторять одно и то же действие.
Как понять
Скопировать ссылку «Как понять» Скопировано
Выражения
Скопировать ссылку «Выражения» Скопировано
Любая программа — это набор операций. Чтобы описать программу, разработчик пишет различные выражения на языке программирования. Посмотрим на самое простое выражение — откроем консоль любого браузера и введём туда элементарное выражение — число.
123 123 Скопировать Скопировано Не удалось скопировать
Когда мы нажмём Enter, консоль ответит нам тем же самым числом. Поздравляю, это было самое простое выражение. Интерпретатор JavaScript выполнил его и вернул результат последней (в данном случае единственной) операции.

Усложним пример и добавим немного действий. Введём в консоль браузера классическую математическую задачку на внимательность:
2 + 2 * 2 2 + 2 * 2 Скопировать Скопировано Не удалось скопировать
JavaScript разбирается в математике, и потому в результате выполнения такого выражения мы получим число 6 . Как JavaScript считал?
2 + 2 * 2 – составное выражение. В нем есть как выражения, представляющие числа, так и выражения, представляющие операции с числами. Таких выражений может быть много, с их помощью мы комбинируем и трансформируем значения.
Составные выражения лучше понимать в виде схемы:

Операциям сложения и умножения нужны два выражения – левое и правое, чтобы вычислить результат. В левой части сложения будет число 2, а в правой — составное выражение 2 * 2 , которое будет аналогично разбираться по частям.
Рассмотрим пример чуть сложнее. Введём в консоль:
(1 + 3) * (4 — 2) (1 + 3) * (4 — 2) Скопировать Скопировано Не удалось скопировать
Схематично выражение можно представить так:

Как и в предыдущем примере, можно проследить из каких частей состоит выражение и как эти части связаны. В итоге мы получим ответ 8 .
Из всех перечисленных примеров можно сделать вывод, что выражения оперируют с данными — это могут быть не только числа, но и строки, и сложные структуры данных. Данные сочетаются с операциями над ними (например, сложение, вычитание, умножение), и программа выдаёт результат выражения. Удобно представлять выражение как наборы данных в сочетании с операциями, которые их обрабатывают. Схематично программу, состоящую из выражений, можно изобразить как последовательность блоков.

Инструкция
Скопировать ссылку «Инструкция» Скопировано
Работа с данными — это ещё не все, что нужно для создания программы. Выражения не решают много вопросов: Как описать с помощью выражения действие по определённому условию? Да, у нас будут данные и можно написать выражение, чтобы вычислить условие, но как сказать программе делать то или иное действие? А если какое-то действие нужно повторить несколько раз?
Для этого в языках программирования существуют инструкции. Они не являются выражениями, но позволяют правильно настроить порядок их выполнения.
Например, используя инструкцию if , написать программу с условием:
const someNumber = getSomeRandomNumber() if (someNumber > 10) console.log(‘Больше десяти’)> else console.log(‘Меньше десяти’)> const someNumber = getSomeRandomNumber() if (someNumber > 10) console.log(‘Больше десяти’) > else console.log(‘Меньше десяти’) > Скопировать Скопировано Не удалось скопировать
Инструкции ничего не вычисляют и не возвращают результат, поэтому они не являются выражениями. Например, инструкция if позволяет описать несколько путей выполнения программы. Её условие будет вычислено с помощью выражения ( num > 10 является выражением и возвращает булевый результат, а внутри условных веток так же будут присутствовать другие выражения (вызов функции – это выражение и оно возвращает результат).
Таким образом, объединяя всего одну инструкцию с выражениями мы получаем программу с ветвлением:

На самом деле, в JavaScript есть выражение, которое позволяет возвращать значение по условию. Таким выражением является тернарный оператор. Как любое выражение, он возвращает значение.
const result = someNumber > 10 ? ‘Больше десяти’ : ‘Меньше десяти’ const result = someNumber > 10 ? ‘Больше десяти’ : ‘Меньше десяти’ Скопировать Скопировано Не удалось скопировать
А используя инструкцию for или while можно зациклить какое-то действие:
let sum = 0 // В этой строчке инструкцией является for и объявление переменной, а все остальное — выраженияfor (let i = 1; i < 10; i++) // Прибавляем значение, это является выражением sum = sum + 1> let sum = 0 // В этой строчке инструкцией является for и объявление переменной, а все остальное — выражения for (let i = 1; i 10; i++) // Прибавляем значение, это является выражением sum = sum + 1 > Скопировать Скопировано Не удалось скопировать
И точно так же, объединяя инструкцию с другими выражениями мы получаем более осмысленную программу.

В JavaScript все инструкции можно поделить на несколько категорий:
- управление потоком выполнения ( if и else , switch , throw и так далее);
- итерации ( for , while и так далее);
- объявление значений ( var , let , const );
- функции ( function , return и так далее);
- прочие ( debugger , import , export ).
Написать программу можно только совмещая выражения, которые работают с данными, и инструкции, которые позволяют управлять порядком выполнения.
Выражения + Инструкции = ❤️
Как писать
Скопировать ссылку «Как писать» Скопировано
С практической стороны стоит помнить главную особенность инструкций — их нельзя использовать в местах, где ожидается выражение. Чтобы понять о чем идёт речь, посмотрим на пример:
getBioAbout( if (num > 10) else ) // Выведет ошибку: SyntaxError: Unexpected token ‘if getBioAbout( if (num > 10) return ‘Шерлок’ > else return ‘Ватсон’ > ) // Выведет ошибку: SyntaxError: Unexpected token ‘if Скопировать Скопировано Не удалось скопировать
Такой пример не будет работать. В качестве аргумента при вызове можно передавать простое выражение (например, конкретную строку ‘Илон Маск’ или число 5 ), либо составное выражение, которое вычислит и вернёт значение (например, вызов другой функции get Current User ( ) ). Но передавать инструкцию в функцию нельзя.
// Передаём составное выражение, которое вычислит и вернёт строкуgetBioAbout(‘Илон Маск’)getBioAbout(‘Шерлок’ + ‘ ‘ + ‘Холмс’)getBioAbout(getCurrentUser()) // Передаём составное выражение, которое вычислит и вернёт строку getBioAbout(‘Илон Маск’) getBioAbout(‘Шерлок’ + ‘ ‘ + ‘Холмс’) getBioAbout(getCurrentUser()) Скопировать Скопировано Не удалось скопировать
Последовательные инструкции можно разделять оператором точка с запятой ; .
// Разделяем последовательные инструкцииconst num = 5; if (5 < 10) <>;if (5 > 10) <>; // Разделяем последовательные инструкции const num = 5; if (5 10) >; if (5 > 10) >; Скопировать Скопировано Не удалось скопировать
А вот выражения можно разделять через оператор запятая , . В этом случае все выражения выполнятся по порядку слева направо, но результат вернётся только от последнего в цепочке. Оператор запятая почти не используется, т.к его использование часто усложняет код.
function x() return 1>function z() return 2> x(), z() // вернётся значение 2, потому что z() выполнился последним function x() return 1 > function z() return 2 > x(), z() // вернётся значение 2, потому что z() выполнился последним Скопировать Скопировано Не удалось скопировать
Источник: doka.guide
Выражения и операции в языке Паскаль
Выражения – это конструкции языка, которые задают порядок выполнения действий над элементами данных.
Выражение состоит из операндов (operand – элемент данных, участвующий в операции), объединенных знаками операций. Операндами могут быть константы, переменные и вызовы функций. Тип значения выражения определяется типом его операндов и выполняемыми над ними операциями. Например,
- выражение: b > a + 10 ;
- b — левый операнд, a + 10 — правый операнд, > — операция отношения; результат имеет логический тип.
Важно: величины, составляющие выражение, должны быть совместимых типов.
Операции могут быть унарными и бинарными. Унарная операция относится к одному операнду и записывается перед ним (например, -х ), бинарная – выражает отношение между двумя операндами и записывается между ними (например, a + b ). Операции определяют действия над операндами, выполняемыми в соответствии с приоритетами:
- Унарные -, not, .
- Операции типа умножения: *, /, div, mod, and, …
- Операции типа сложения: +, -, or, …
- Операции отношения: =, , <>, =, …
Заметим, что если в выражении встречаются функции, то они вычисляются в первую очередь. Порядок выполнения операций можно изменить с помощью круглых скобок.
В текущем уроке разберем операции отношения, арифметические и логические операции, остальные — будем рассматривать по мере изучения материала.
Арифметические выражения и операции
Выражение, составленное из операндов целочисленных или вещественных типов, объединенных знаками арифметических операций и круглыми скобками, называется арифметическим.
Результат арифметического выражения может принимать целое или вещественное значение.
К арифметическим операциям относятся:
- унарные операции: + , — для вещественных и целых чисел;
- бинарные операции: +, -, *, / для вещественных и целых чисел;
- бинарные операции: div, mod для целых чисел.
Выражения и операции отношения
Выражение, состоящее из операндов, связанных операцией отношения, называется выражением отношения.
Две операции отношения = и <> применяются ко всем типам, остальные — к операндам простого типа и к строкам.
Операции отношения, путем сравнения двух операндов, позволяют определить истинно ( true ) или ложно (false) значение выражения.
Логические выражения и операции
Выражение, состоящее из операндов, связанных логическими операциями, называется логическим выражением.
Операндами логического выражения могут быть только данные типа boolean , результатом — значение истинно (true) или ложно (false) .
К логическим операциям, которые подчиняются стандартным правилам алгебры логики, относятся:
- унарная операция not ;
- бинарные операции and, or, xor .
Логические операции и, рассмотренные выше, операции отношения широко применяются для реализации разветвляющихся и циклических алгоритмов.
Источник: informatics-lesson.ru