Знайте свої смакові рецепти
Є дивовижна кількість людей, які вважають, що регулярні вирази є по суті мовними агностиками. Однак насправді існують досить істотні відмінності між смаками, і особливо для кодового гольфу добре знати декілька з них та їх цікаві особливості, так що ви можете підібрати найкраще для кожного завдання. Ось огляд кількох важливих ароматів та того, що відрізняє їх від інших. (Цей список насправді не може бути повним, але дайте мені знати, якщо я пропустив щось дійсно кричуще.)
Perl і PCRE
Я кидаю їх в один горщик, оскільки я не надто знайомий зі смаком Perl, і вони здебільшого еквівалентні (PCRE - це все-таки Perl-сумісні регулярні вирази). Основна перевага аромату Perl полягає в тому, що ви можете дійсно зателефонувати за кодом Perl зсередини регулярного вираження та заміни.
- Рекурсія / підпрограми . Мабуть, найважливіша особливість для гольфу (яка існує лише в парі ароматів).
- Умовні візерунки
(?(group)yes|no)
.
- Підтримує зміна в разі заміни рядка з
\l
, \u
, \L
і \U
.
- PCRE дозволяє чергуватись у відстані, де кожна альтернатива може мати різну (але фіксовану) довжину. (Більшість ароматів, включаючи Perl, вимагають, щоб виглядники мали загальну фіксовану довжину.)
\G
прив’язати відповідність до кінця попереднього матчу.
\K
щоб скинути початок матчу
- PCRE підтримує як властивості символів Unicode, так і сценарії .
\Q...\E
щоб уникнути більш тривалих символів. Корисно, коли ви намагаєтеся зіставити рядок, що містить багато мета-символів.
.NET
Це, мабуть, найпотужніший аромат, із недостатками дуже мало.
Одним з важливих недоліків у плані гольфу є те, що він не підтримує властивих кванторів, як деякі інші аромати. Замість цього .?+
вам доведеться писати (?>.?)
.
Java
- Через помилку (див. Додаток) Java підтримує обмежений тип змінної довжини ззаду: ви можете дивитися позаду до початку рядка,
.*
звідки тепер ви можете запустити пошук, наприклад (?<=(?=lookahead).*)
.
- Підтримує об'єднання та перетин класів символів.
- Має найбільш широку підтримку Unicode, з класами символів для "Сценаріїв, блоків, категорій та бінарних властивостей Unicode" .
\Q...\E
як у Perl / PCRE.
Рубін
В останніх версіях цей аромат аналогічно потужний як PCRE, включаючи підтримку викликів підпрограми. Як і Java, він також підтримує об'єднання та перетин класів символів. Однією особливістю є вбудований клас символів для шістнадцяткових цифр: \h
(та заперечення \H
).
Найбільш корисною особливістю для гольфу є те, як Рубі обробляє квантори. Найбільш помітно, що можна встановити квантори без дужок. .{5,7}+
працює і так робить .{3}?
. Крім того, на відміну від більшості інших ароматизаторів, якщо нижня межа квантора 0
може бути опущена, наприклад .{,5}
, еквівалентна .{0,5}
.
Що стосується підпрограм, основна відмінність між підпрограмами PCRE і підпрограмами Рубі полягає в тому, що синтаксис Рубі є байтом довше (?n)
проти \g<n>
, але підпрограми Рубі можна використовувати для захоплення, тоді як PCRE скидає зйомки після закінчення підпрограми.
Нарешті, Ruby має іншу семантику для лінійних модифікаторів, ніж більшість інших ароматів. У Ruby завжди ввімкнено модифікатор, який зазвичай називають m
іншими ароматами . Отже, і завжди порівнюйте початок і кінець рядка, а не лише початок і кінець рядка. Це може заощадити вам байт, якщо вам потрібна така поведінка, але це коштуватиме додаткових байтів, якщо ви цього не зробите, тому що вам доведеться замінити і на, і відповідно. На додаток до цього, модифікатор, який зазвичай називається (який робить підсилювач ліній передач), називається в Ruby. Це не впливає на кількість байтів, але слід пам’ятати, щоб уникнути плутанини.^
$
^
$
\A
\z
s
.
m
Пітон
Python має міцний аромат, але я не знаю жодних особливо корисних функцій, яких ви б не знайшли більше ніде.
Однак є альтернативний аромат, який призначений замінити re
модуль в якийсь момент і який містить багато цікавих особливостей. Окрім додавання підтримки для рекурсії, огляду операторів комбінації класів символів із змінною довжиною, вона також має унікальну особливість нечіткого зіставлення . По суті, ви можете вказати ряд помилок (вставки, видалення, заміни), які допускаються, і двигун також дасть вам приблизні збіги.
ECMAScript
Аромат ECMAScript дуже обмежений, а отже, рідко дуже корисний для гри в гольф. Єдине, для чого це дістається - це заперечений порожній символ символів [^]
для відповідності будь-якому символу, а також безумовно невдалий клас порожніх символів []
(на відміну від звичайного (?!)
). На жаль, аромат не має ніяких особливостей, що робить останній корисним для нормальних проблем.
Луа
У Lua є свій досить неповторний аромат, який досить обмежений (наприклад, ви навіть не можете кількісно оцінити групи), але він має декілька корисних та цікавих особливостей.
- У ньому є велика кількість скорочень для вбудованих класів символів , включаючи розділові знаки, великі та малі символи та шістнадцяткові цифри.
- З
%b
ним підтримується дуже компактний синтаксис, який відповідає збалансованим рядкам. Наприклад, %b()
відповідність а, (
а потім все до відповідності )
(правильно пропускаючи внутрішні пари). (
і тут )
можуть бути будь-які два символи.
Підвищення
Регекс-аромат Boost по суті є перламутровим. Однак він має деякі приємні нові функції заміни регулярних виразів, включаючи зміни в регістрі та умовні умови . Останнє є унікальним для Boost, наскільки я знаю.