Содержание

30 примеров полезных регулярных выражений

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

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

Изучение регулярных выражений (regex) довольно сложный процесс, особенно для начинающих, но при правильном подходе, вы освоите чрезвычайно мощный и полезный инструмент.

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

(?=.*[A-Z].*[A-Z])(?=.*[!@#$&*])(?=.*[0-9].*[0-9])(?=.*[a-z].*[a-z].*[a-z]).{8}$

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

Код цвета в шестнадцатеричном формате

\#([a-fA-F]|[0-9]){3, 6}

Шестнадцатеричные коды цветов используются при веб-разработке очень часто. Это регулярное выражение может быть поможет сравнить: совпадает ли какая-либо строка с шаблоном шестнадцатеричного кода.

Проверка адреса электронной почты

/[A-Z0-9._%+-]+@[A-Z0-9-]+.+.[A-Z]{2,4}/igm 

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

IP-адрес (v4)

/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/ 

Как e-mail может использоваться для идентификации посетителя, так IP-адрес является идентификатором конкретного компьютера в сети. Приведенное регулярное выражение проверяет соответствие строки формату IP-адреса v4.

IP-адрес (v6)

(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.
\s]*$ //соответствует фразе из 5 и более ключевых слов

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

Выражения могут проверять фразы, содержащие определенное количество слов (например, 5), а также фразы количество слов в которых более двух, трех и т.д. Одно из самых мощных выражений, используемое для сортировки данных аналитики.

Поиск валидной строки Base64 в PHP

\?php[ \t]eval\(base64_decode\(\'(([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?){1}\'\)\)\; 

Если вы являетесь PHP-разработчиком, то иногда вам может понадобиться найти объект, закодированный в формате Base64. Указанное выше выражение может использоваться для поиска закодированных строк в любом PHP-коде.

Проверка телефонного номера

^\+?\d{1,3}?[- . (?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$ 

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

В PHP имеется отличная функция date(), но она не всегда подходит, ведь в нее может быть передана необработанная строка. Поэтому для проверки указанного формата даты нужно использовать приведенное выше регулярное выражение.

Совпадение строки с адресом видеоролика на YouTube

/http:\/\/(?:youtu\.be\/|(?:[a-z]{2,3}\.)?youtube\.com\/watch(?:\?|#\!)v=)([\w-]{11}).*/gi 

На протяжении нескольких лет на Youtube не меняется структура URL-адресов. Youtube является самым популярным видео хостингом в Интернет, благодаря этому, видео с Youtube набирают наибольший трафик.

Если вам необходимо получить ID какого-либо видеоролика с Youtube, воспользуйтесь приведенным выше регулярным выражением. Это наилучшее выражение, подходящее для всех вариантов URL-адресов на этом видео-хостинге. \s*[a-zA-Z\-]+\s*[:]{1}\s[a-zA-Z0-9\s.#]+[;]{1}

Ситуация, когда придется воспользоваться указанным регулярным выражением, может сложиться очень редко, но не факт что не сложится никогда

Этот код можно использовать когда будет необходимо «вытянуть» какое-либо CSS-правило из списка правил для какого-нибудь селектора.

Удаление комментариев в HTML

<!--(.*?)--> 

Если вам необходимо удалить все комментарии из блока HTML-кода, воспользуйтесь этим регулярным выражением. Чтобы получить желаемый результат, вы можете воспользоваться PHP-функцией preg_replace().

Проверка на соответствие ссылке на Facebook-аккаунт

/(?:http:\/\/)?(?:www\.)?facebook\.com\/(?:(?:\w)*#!\/)?(?:pages\/)?(?:[\w\-]*\/)*([\w\-]*)/ 

Если вам необходимо узнать у посетителя вашего сайта адрес его странички в Facebook, попробуйте это регулярное выражение. Оно поможет вам проверить правильность указанного пользователем URL. .*MSIE [5-8](?:\.[0-9]+)?(?!.*Trident\/[5-9]\.0).*$

Несмотря на то, что Microsoft выпустил новый браузер Edge, многие пользователи до сих пор пользуются Internet Explorer. Веб-разработчикам часто приходится проверять версию этого браузера, чтобы учитывать особенности разных версий при работе над своими проектами.

Вы можете использовать это регулярное выражения в JavaScript-коде чтобы узнать какая версия IE (5-11) используется.

«Вытягиваем» цену из строки

/(\$[0-9,]+(\.[0-9]{2})?)/ 

Цена какого-либо товара может быть указана в различных форматах: в ней могут встречаться запятые, знаки после запятой и символы валюты.

Указанное выше регулярное выражение учитывает различные форматы отображения цены, с его помощью вы сможете «вытянуть» цену из любой символьной строки.

Разбираем заголовки в e-mail

/\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}\b/i

С помощью этого небольшого выражения вы сможете разобрать заголовок e-mail сообщения, чтобы извлечь оттуда список адресатов. ]*))/g

Вы можете составить свои собственные регулярные выражения для манипулирования результатами поиска по вашим запросам в поисковой системе Google. Например, знак плюс (+) добавляет дополнительные ключевые слова, а минус (-) означает, что слова должны быть проигнорированы и удалены из результатов.

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

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

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

Почитать оригинал статьи

[ELMA3] Пример применения регулярных выражений для строковых полей

ELMA3 / ELMA3: Управление бизнес-процессами / Примеры / [ELMA3] Пример применения регулярных выражений для строковых полей

Регулярное выражение – это шаблон, который обработчик регулярных выражений пытается сопоставить с введенным текстом. ([1-9]{1}[0-9]{9})?$

Разберем выражение:

  1. [1-9]{1} – указывает на то, что первым символом будет любая цифра, кроме 0.
  2. [0-9]{9} – позволяет ввести 9 цифр.

Пример: 4951234567

Пример проверки строки на соответствие формату электронной почты

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

Регулярное выражения для проверки email:

Разберем выражение по частям:

  1. ([a-z0-9_-]+\.)* — позволяет ввести:
    1. в [] указан допустимый диапазон символов: символы латинского алфавита от a до z в нижнем регистре, цифры и символы ‘_’ и ‘-’.
    2. квантор ‘+’ после [] означает, что должен быть введен хотя бы один символ из диапазона, указанного в [].
    3. в выражении ‘\.’ ‘\’ является экранирующим символом, и указывает на то, что ‘.’ является не диапазоном любых символов, а метасимволом (т.
      е. в конце выражения должна присутствовать точка).
    4. ‘*’ в ‘()*’ означает, что все, что находится в () может повторяться 0 или более раз.

Пример: ivan19.ivanovich.

  1. [a-z0-9_-]+@[a-z0-9-]+ — позволяет ввести:
    1. символы латинского алфавита от a до z в нижнем регистре, цифры и символы ‘_’ и ‘-’.
    2. квантор ‘+’ после [] означает, что должен быть введен хотя бы один символ из диапазона, указанного в [].
    3. символ ‘@’.
    4. символы латинского алфавита от a до z в нижнем регистре, цифры и символ ‘-’.
    5. квантор ‘+’ после [] означает, что должен быть введен хотя бы один символ из диапазона, указанного в [].

Пример: ivanov2000@example_2000

  1. (\.[a-z0-9-]+)* — позволяет ввести:
    1. в выражении ‘\.’ ‘\’ является экранирующим символом, и указывает на то, что ‘.’ является не диапазоном любых символов, а метасимволом (т. е. в начале выражения должна присутствовать точка).
    2. символы латинского алфавита от a до z в нижнем регистре, цифры и символ ‘-’.
    3. квантор ‘+’ после [] означает, что должен быть введен хотя бы один символ из диапазона, указанного в [].
    4. ‘*’ в ‘()*’ означает, что все, что находится в () может повторяться 0 или более раз.

Пример: .example

  1. \.[a-z]{2,6} – позволяет ввести:
    1. в выражении ‘\.’ ‘\’ является экранирующим символом, и указывает на то, что ‘.’ является не диапазоном любых символов, а метасимволом (т.е. в начале выражения должна присутствовать точка).
    2. символы латинского алфавита.
    3. в кванторе {} указано допустимое количество символов, в данном случае – от 2 до 6.

Пример: .com

Данный шаблон позволит ввести, например, следующие e-mail адреса:

  • [email protected];
  • ivan_ivanov@example.
    \/:*?»<>|+]{1})?$

    Пример:

    • C:\Windows\System32\calc.exe;
    • Z:\test.txt.

    Шпаргалка по регулярным выражениям JavaScript и примеры

    Диаграмма выше, созданная с помощью Regulex

    В этом сообщении блога дается обзор синтаксиса регулярных выражений и функций, поддерживаемых JavaScript. Примеры были протестированы на консоли Chrome/Chromium (версия 81+) и включают функции, недоступные в других браузерах и платформах. Предполагается набор символов ASCII, если не указано иное. Этот пост является выдержкой из моей книги JavaScript RegExp.

    Элементы, определяющие регулярное выражение

    /pat/ объект RegExp const pet = /dog/ сохранить регулярное выражение в переменной для повторного использования, ясности и т.д.0023 Проверить, присутствует ли данный шаблон где-либо во входной строке возвращает true или false i флаг игнорировать регистр при сопоставлении алфавитов g флаг для соответствия всем вхождениям new RegExp('pat', 'i') построить RegExp из строки второй аргумент указывает флаги использовать строки обратной кавычки со свойством ${} для интерполяции source для преобразования объекта RegExp в строку 900 19 помогает вставить RegExp внутри другого RegExp flags свойство для получения флагов объекта RegExp s. replace(/pat/, 'repl') метод поиска и замены и $ анкеры \r , \n , \u2028 и \u2029 есть разделители строк файлы в стиле dos используют \r\n , может потребовать особого внимания \b ограничивает совпадение началом/концом слов словесные символы: буквы, цифры, подчеркивание 900 14 9 символ вместо того, чтобы действовать как якорь.


    Функция Описание
    pat1|pat2|pat3 несколько регистров exp в сочетании как условное ИЛИ
    каждая альтернатива может иметь независимые якоря
    (pat) шаблон(ы) группы, а также группа захвата
    a(b|c)d аналогично abd|acd
    (?:pat) группа без захвата
    (?<name>pat) 9 0024 именованная группа захвата
    . соответствует любому символу, кроме разделителей строк
    [] Класс символов, соответствует одному символу из многих 0013
    Жадные квантификаторы Описание
    ? совпадение 0 или 1 раз
    * совпадение 0 или более раз
    + совпадение 1 или более раз
    { m,n} соответствует m по n раз
    {m,} соответствует не менее m раз
    {n} точное соответствие n раз
    pat1.*pat2 любое количество символов между pat1 и pat2
    pat1. *pat2 |pat2.*pat1 соответствует обоим pat1 и pat2 в любом порядке также будет соблюдать общее регулярное выражение. Добавление ? к жадным квантификаторам делает их нежадными , т.е. соответствует как минимально возможному . Квантификаторы можно применять к буквальным символам, группам, обратным ссылкам и классам символов.


    Класс символов Описание
    [ae;o] совпадение 9023 7 любые из этих символов один раз
    [3-7] диапазон персонажей из 9 не должен быть первым символом или экранироваться с помощью \
    [\]\\] ] и \ следует экранировать с помощью \
    аналогично [A-Za-z0-9_] для совпадения словесных символов
    \d аналогично [0-9] для совпадения цифровых символов
    аналогично [ \t\n\r\f\v] для соответствия пробельным символам
    используйте \W , \D и \S для их противоположностей соответственно 90 024
    u флаг для включения соответствия Unicode {} отрицательные наборы символов Unicode
    см. MDN: Unicode имущество побегов для деталей
    \u{} указать символы Юникода, используя кодовые точки

    Поиск 9001 6 Описание
    просмотры позволяет создавать пользовательские положительные/отрицательные утверждения
    нулевой ширины, как якоря, и не является частью совпадающих частей
    (?!pat) отрицательное предварительное утверждение
    (?<!pat) отрицательное утверждение просмотра назад
    (?=pat) положительное утверждение просмотра назад 9 0024
    (? положительное утверждение просмотра назад
    переменная длина просмотр назад разрешен
    (?!pat1)(?=pat2) несколько утверждений могут быть указаны рядом друг с другом в любом порядке
    поскольку они отмечают совпадающее местоположение без использования символов
    ((?!pat). )* Отменяет шаблон регулярного выражения

    9001 9 9 0023 Обратная ссылка 900 23 то же, что и $N , позволяет отделить обратную ссылку и другие цифры 900 23 именованная группа захвата
    Совпадающая часть Описание
    m = s.match (/pat/) при условии, что флаг g не используется и регулярное выражение выполнено успешно,
    возвращает массив с совпавшей частью и 3 свойствами
    свойство index дает начальное местоположение матч
    свойство ввода дает входную строку s
    группы свойство дает словарь именованных групп захвата
    m[0] для приведенного выше случая, дает полное соответствие часть
    m[N] сопоставленная часть N-й группы захвата
    s.match(/pat/g) совпадающие порции, без свойств
    s. matchAll(/pat/g) возвращает итератор, содержащий подробности для
    каждой совпавшей части и ее свойств
    дает совпавшую часть N-й группы захвата
    используйте $1 , $2 , $3 и т. д. в сменном разделе
    $& дает всю соответствующую часть 9 0024
    $` дает строку перед совпадающей частью
    $' дает строку после совпадающей части
    использование \1 , \2 , \3 и т.д. в определении регулярного выражения
    $$ вставить $ буквально в раздел замены
    $0N
    \N\xhh позволяет разделить обратную ссылку и цифры в определении регулярного выражения
    (?<name>pat)
    используйте \k<name> для обратные ссылки в определении регулярного выражения
    используйте $<name> для обратных ссылок в разделе замены

    Примеры регулярных выражений🔗

    • тест метод
     > пусть предложение = 'Это образец строки'
    > /is/. t', 'dog$', 'f|x']), 'g')
     
    • метасимвол точки и квантификаторы
     // соответствует символу '2', любому символу, а затем символу '3'
    >
    '42\t33'.replace(/2.3/, '8') 'Привет\nХорошего дня'.replace(/the.*ice/s, 'X') 'parrot parrot parent'.replace(/par(en|ro)?t/g, 'X') ['abc', 'ac', 'abbc', 'xabbbcz'].filter(w => /ab{1,4}c/.test(w))
    • сопоставление метод
     // вся сопоставленная часть
    > 'abc ac adc abbbc'.match(/a(.*)d(.*a)/)[0]
     'abc ac adc abbbc'.match(/a(.*)d(.*a)/)[2]
     'кошка и собака'.match(/dog/).index
     'par spar кажущаяся запасная часть'.match(/\bs?par[et]\b/g)
     'это совершенно сфабрикованная история'.match(/t.*?a/g)
     
    • matchAll метод
     // аналогично: match(/ab*c/g)
    > Array.from('abc ac adc abbbc'.matchAll(/ab*c/g), m => m[0])
     Array.from('abc ac adc abbbc'.matchAll(/ab*c/g), m =>
    m.index) пусть s = 'xx:yyy x: x:yy :y' > Array. from(s.matchAll(/(x*):(y*)/g), m => m.slice(1))
    • функция/словарь в разделе замены
     > function titleCase(m, g1, g2) {
            вернуть g1.toUpperCase() + g2.toLowerCase()
      }
    > 'aBc ac ADC aBbBC'.replace(/(a)(.*?c)/ig, titleCase)
     '1 42 317'.replace(/\d+/g, m => m*2)
     пусть поменять местами = { 'кот': 'тигр', 'тигр': 'кот' }
    > 'кот, тигр, собака, тигр, кошка'.replace(/cat|tiger/g, k => swap[k])
     
    • разделение метод
     // разделение на основе одного или нескольких цифровых символов
    >
    'Sample123string42with777numbers'.split(/\d+/) 'Sample123string42with777numbers'.split(/(\d+)/) '**1\f2\n3star\t7 77\r**'.split(/[\d\s]+/) '123handed42handy777handful500'.split(/hand(?:y|ful)?/)
    • обратные ссылки с обычными/незахватываемыми/именованными группами захвата
     // удалить последовательные повторяющиеся слова, разделенные пробелом
    // используйте \W+ вместо пробела, чтобы покрыть такие случаи, как 'a;a<-;a'
    > 'aa a a a 42 f_1 f_1 f_13. ,]+)/, '$1($2)' )
     'хорошо,плохо 42,24'.replace(/(?\w+),(?\w+)/g, '$<sw>
    ,$<fw>')
    • примеры поиска
     // изменить 'foo', только если за ним не следует цифра
    // обратите внимание, что конец строки удовлетворяет заданному утверждению
    // обратите внимание, что 'foofoo' имеет два совпадения
    > Эй, еда! foo42 foot5 foofoo'.replace(/foo(?!\d)/g, 'баз')
     ':cart apple --rest ;tea'.replace(/(?<!:|--)\b\w+/g, 'X')
     '42 фу-5, баз3; х83, у-20; f12'.match(/(? let words = ['секвойя', 'под вопросом', 'экспонат', 'уравнение']
    >words.filter(w => /(?=.*a)(?=.*e)(?=.*i)(?=.*o).*u/.test(w))
     'cat scatter cater scat'.replace(/(? /at((?!do).)*par/.test('лиса,кошка,собака,попугай')
     

    Инструменты отладки и визуализации🔗

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

    regex101 — популярный сайт для проверки регулярного выражения. Сначала вам нужно будет выбрать вариант JavaScript. Затем вы можете добавить свое регулярное выражение, входные строки, выбрать флаги и необязательную строку замены. Совпадающие части будут выделены, и объяснение будет предложено на отдельных панелях. Также есть краткий справочник и другие функции, такие как совместное использование, генератор кода, викторина и т. д.

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


    Книга JavaScript RegExp🔗

    Посетите мой репозиторий Learn_js_regexp, чтобы узнать подробности о книге, которую я написал о регулярных выражениях JavaScript. Электронная книга использует множество примеров для объяснения основных понятий и включает упражнения для проверки вашего понимания. Шпаргалка и примеры, представленные в этом посте, основаны на содержании этой книги.

    Учебник по регулярным выражениям — Быстрая шпаргалка с примерами | Джонни Фокс | Учебник Factory Mind

    Regex — Быстрая шпаргалка с примерами | Джонни Фокс | Заводской разум | Medium

    Опубликовано в

    ·

    6 минут чтения

    ·

    23 июня 2017 г.

    ОБНОВЛЕНИЕ 10/2022 : Дополнительные пояснения/ответы см. в ответе на историю с!

    Ознакомьтесь с моей статьей REGEX COOKBOOK о наиболее часто используемых (и наиболее востребованных) регулярных выражениях 🎉

    Регулярные выражения (regex или regexp) чрезвычайно полезны для извлечения информации из любого текста путем поиска одного или нескольких совпадений определенного шаблона поиска (т. Подписчики

    · Редактор

    CTO@Factory Mind

    Еще от Джонни Фокса и Factory Mind

    Джонни Фокс

    в

    WebSocket + Node.

    js + Express — Шаг за шагом, используя Typescript

    Краткое пошаговое руководство по WebSocket, Node/Express и Typescript.

    ·5 минут чтения·23 мая 2017 г.

    Джонни Фокс

    в

    Рецепты регулярных выражений  —  Самые популярные регулярные выражения

    Топ-10 наиболее часто используемых (и наиболее востребованных) регулярных выражений

    ·4 мин. чтения · 20 марта 2019 г.

    Jonny Fox

    in

    Angular + Cloud Firestore — Пошаговое руководство (начальная загрузка)

    Вот пошаговый список для проверки эволюции Firebase: Cloud Firestore (бета)! 🎉

    ·4 минуты чтения·18 октября 2017 г.

    Джонни Фокс

    in

    Angular + PDF + Forms = PDF Dynamic Reactive Forms

    91 035 Динамическое создание форм (в частности, с использованием Реактивного «варианта» ) создание любого PDF-файла, предоставленного с формой в Angular Reactive Form

    · 5 минут чтения · 2 февраля 2018 г.

    Просмотреть все от Джонни Фокса

    Рекомендовано Medium

    Somnath Singh

    in

    Кодирования не будет через 5 лет. Вот почему

    Те, кто не приспособятся, перестанут существовать.

    ·8 min read·Jan 20

    Tomer Gabay

    in

    5 хитростей Python, которые отличают старших разработчиков от младших

    Иллюстрировано через различия в подходах к головоломкам Advent of Code

    ·6 мин чтения · 16 9 января0003

    Списки

    Истории, которые помогут вам расти как разработчику программного обеспечения

    19 историй·22 сохранения

    Выбор персонала

    300 историй·62 сохранения

    Aleid ter Weel

    90 004 в

    10 вещей, которые нужно сделать вечером Вместо просмотра Netflix

    Привычки без устройств для повышения продуктивности и счастья.

    ·5 min read·15 февраля 2022 г.

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

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