GIT commit NPE
95 subscribers
298 photos
5 videos
36 links
Кодинг, linux, git, SQL, regex, board games, ножі, треш-індастріал.
Download Telegram
А ви знали, що регекспи можуть бути дуже веселими?

^([^^])^ або (?:\?+?)?(?=\?)

#regex
А ви знали, що знак питання в RegEx-ах має аж чотири контексти?

1. Квантифікатор "нуль або один".
2. Перемикач жадібності квантифікаторів (в тому числі і самОго себе, див. пункт 1).
3. Ознака того, що зміст круглих дужок запам'ятовувати не треба.
4. Ознака ретроспективної перевірки та перевірки, що випереджає.

#regex
Тут було побажання додати пояснень та прикладів до попереднього повідомлення. Тож додамо:

1. Квантифікатор "нуль або один".
Квантифікатор - це символ (або комбінація), що показує, скільки разів повинен повторюватися вираз, що йому передує.
а? - нуль літер "а" або одна літера "а",
(агр)? - нуль фрагментів "агр" або один фрагмент "агр".

2. Перемикач жадібності квантифікаторів.
Квантифікатори бувають жадібні та нежадібні (greedy, non-greedy). Це не всі типи, але зараз про інші не будемо.
Жадібні намагаються охопити якомога більше символів, що задовольняють їм. Нежадібні намагаються обійняти мінімальну кількість.
Довідка: квантифікатор + означає "один або більше".
а+ - жадібний варіант, на зразку "ааагр" він жадібно охопе "ааа",
а+? - нежадібний варіант, на зразку "ааагр" він охопе тільки першу "а".
Так, останній варіант може охопити всі "а", але кожну окремо, тобто це буде три окремих співпадіння.

3. Ознака того, що зміст круглих дужок запам'ятовувати не треба.
При звичайному використанні дужок їх контент запам'ятовується в спеціальні змінні (і може бути використаний декількома способами):
(агр)
А якщо запам'ятовувати не треба, то:
(?:агр)

4. Ознака ретроспективної перевірки та перевірки, що випереджає.
Ці дві перевірки - спосіб перевірити (так, Кеп), чи є перед/після регулярки інший фрагмент, не включаючи його у співпадіння.
На прикладі ретроспективної перевірки:
ааагр - без перевірки, співпаде "ааагр",
(?<=ааа)гр - з перевіркою, співпаде "гр", перед яким є "ааа".

#regex
- Як сказати "до першої зірки"?
- ([^*]+)\*
- ???
- Це по-регексповому...

#regex
Жадібні квантифікатори

Майже завжди квантифікатори регулярних виразів за умовчанням працюють "жадібно": спочатку захоплюють якнайбільше символів, а потім, якщо треба, відкочуються назад і віддають по одному символу наступним елементам регулярки.

Наприклад, у нас є рядок: qqq

Мовою регулярок: q+.+
Українською: один або більше символів "q", а потім один або більше будь-яких символів (щодо "будь-який" не все так просто, але давайте зараз вважати саме так).
Процес: спочатку "q+" співпаде з "qqq", але потім відкотиться на один символ назад, віддаючи останню "q" фрагменту ".+".
Співпадіння: qqq (увесь рядок)

Матасимволом ? ми можемо перемкнути жадібність на протилежну.

Мовою регулярок: q+?.+
Українською: хоча б один символ "q", а потім один або більше будь-яких символів.
Процес: "q+" співпаде з першою "q" і задовольниться, а залишок "qq" співпаде з ".+".
Співпадіння: qqq (увесь рядок)

Уважний слухач в цьомі місці гнівно заволає: І нашо перемикати? Якщо результати однакові, то навіщо платити більше зайві символи?
А давайте тепер запам'ятаємо частину регулярки в групу.

Мовою регулярок: (q+).+
Співпадіння: qqq
Вміст групи, що співпала: qq

Мовою регулярок: (q+?).+
Співпадіння: qqq
Вміст групи, що співпала: q

P.S.: про метасимвол ? я писав ось тут.

#regex
Цікаві діапазони регулярок

В регулярних виразах є така штука, як "діапазон символів" (range of characters). Колись давно в Perl-і я зустрічав ще дивну назву "клас символів".

Це перелік символів у квадратних дужках:
[fH9Б]
, що означає "будь-який символ з перелічених", тобто: f, H, 9, Б.
В такій конструкції можуть бути присутні діапазони виду a-d, що означає "будь-який символ з діапазону", тобто: a, b, c, d.
Наприклад:
[7a-dXD]
А як додати у перелік сам дефіс, щоб він не був сприйнятий метасимволом?
Дуже просто: треба вказати його на початку або в кінці. Звісно, можна і заескейпити, але зайві символи в регулярці зазвичай додають ентропії. Цілих два (!) зайвих символа - це якщо ми кажемо про мови типу Джави, де ескейпінг у літералах виконується слешем ("\").

І от довелося мені робити задачу, однією зі складових якої була регулярка, що повинна містити перелік з коми, крапки, пробілу та дефісу.
І якось так вийшло, шо під час змін і перестановок дефіс виліз в середину, а я це якось прої проґавив:
[,-. ]

Під час рев'ю на це звертає увагу тімлід і, проміж іншим, коментує, що дійсно, воно буде інтерпретовано як усі символи між комою та крапкою плюс пробіл.
І додає: а за неймовірним збігом обставин інтервал між комою та крапкою містить лише "-".

Я такий: О_О
А й дійсно (див. скрін вище).

Той випадок, коли неправильно написана програма працює так, як очікувалося.

#regex
Теги каналу. Для зручності. Буде доповнюватися за необхідністю.
#boardGames
#git
#knives
#linux
#places
#regex