Реджкс-70-летний динозавр-тут современная альтернатива

Реджкс-70-летний динозавр-тут современная альтернатива

17 июля 2025 г.

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

Что ж, если вы можете ответить на все вопросы с помощью четкого сокращения «Да, сэр», и ваша психотерапия становится слишком дорогой, послушайте.
Regex стала стандартом для сопоставления рисунков в тексте. Почему? Потому что это было там, когда начался весь ИТ -бизнес, с фундаментальными идеями возвращались в 1950 -е годы!
Тогда у вас был рок -н -ролл, автомобили с пробежком, сравнимыми с современными космическими кораблями и телефонным оператором с прекрасными голосами. Это было не все плохо, и тогда регулярные выражения имели смысл: в теории!
Но в настоящее время у нас есть альтернативы, например, текстовый процессор с именем

Сценарий (https://github.com/scripal-git/scripal)

Среди них так много концепций и инструментов из пионерских дней ИТ. Но в большинстве областей мы видели радикальный сдвиг в сторону новых идей и инструментов. Сегодня это интуитивно понятный, простой в использовании nosql с Mongodb, Neo4j и Redis. Мир - это не просто столы, это дерева -структуры, сети и сложные ссылки.
Теперь у нас есть JSON, XML, YAML и не только CSV. Наконец, Unicode и UTF-8/16 стали стандартом, отдыхая в мире ASCII. Сегодня мы пишем наше программное обеспечение в Python или C#, и он просто работает на любой машине с необходимой поддержкой. Нет больше C навсегда, компилируя на определенной машине (записать, только на in-on-my-machine-in-the-mom-don-touch-it) и недостатки памяти.

Мир изменился, и наши повседневные инструменты стали намного более сложными и удобными. За исключением: когда дело доходит до анализа и совпадения струн: привет 1950 -е годы, Джерри Ли Льюис «Великие шары огня», играя на радио AM.
Я видел очень мало идей об альтернативах, и мы все знаем, как может быть раздражающая регуляция.

Вот проблема:

Нечитаемым без использования LSD на рабочем месте:

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

function Sum(var X, Y: Integer): Integer; stdcall;
begin
  asm
    MOV                EAX,X
    MOV                EAX,[EAX]
    MOV                EDX,Y
    ADD                EAX,[EDX]
    MOV                @Result,EAX
  end;
end;

А теперь regex:

(?:(?<=^|\s)(?=\S)|(?<=\S|^)(?=\s))this (?:(?<=\S)(?=\s|$)|(?<=\s)(?=\S|$))

Что хуже, чувак? Почему люди принимают этот доисторический синтаксис? Мы говорим о динозавре здесь. Через некоторое время это нечитаемо для вас и, конечно, для ваших коллег.
Вам нужны пожизненные враги? Попросите своего коллеги дать вам регулярную форму, чтобы соответствовать номерам в диапазоне [-3467, 948764].

Я видел, как люди вмешиваются в выражения в течение нескольких часов, хотя вы бы написали источник с помощью струнных функций Python через несколько минут. Но люди просто используют Regex, потому что это стандарт, и потому что они все используют его. «Но все они пьют кока -кола»… ну, у кока -кола есть конкурентов, таких как Pepsi. Даже ассемблер позволяет комментариям, чтобы описать ваши идеи. Большинство двигателей режима нет, это не является частью какого -либо стандарта. О, верно, стандарт: сколько вкусов корзины? Вы Google Google Solution, и, конечно же, это аромат Perl, и ваш Node.js просто не будет работать с примером.

Медленно, как в медленной, как черепаха с 3 ногами:

Я видел, как regex все хорошо, скажем, 2K текстовых кусков. Как только они растут больше, время выполнения может взорваться, или может произойти переполнение стека. Время может расти в геометрической прогрессии, связанном с размером входа, в зависимости от используемого шаблона. При обратном отслеживании у нас обычно есть сложность O (2^n)*.* У нас были некоторые проекты, которые довольно хорошо работали с небольшими данными тестирования, но во время производства размер роста и повторная экспозиция должна была быть заменена в течение ночи стандартными струнными функциями и ручным парированием, повышается уровни адреналина.

Есть так много примеров:

Stack Overflow имел 34-минутный отключение в 2016 году, вызванный
^[\s\u200c]+|[\s\u200c]+$

и примерно 20 000 последовательных персонажей пробелов в строке комментариев.
Многие выражения возврата - это бомбы.

Primtive. Ты, женщина, я, мужчина, ты делаешь еду на кухне:

Regex не понимает цифр и интерпретирует их как отдельные символы! Ну, ваш процессор знает цифры, почему такое отсутствие функциональности? Редж работает над одиночными персонажами и забывает остальной мир. Но мы, разработчики, думаем в цифрах, словах, фразах ... иногда очень сложно сформулировать коррекс даже для простых струнных частей. Многие двигатели по -прежнему не предлагают настоящей поддержки Unicode, и разработчики удивляются жалобами от китайских пользователей. Это ужасно, и вы замечаете, как раз когда эти двигатели были разработаны, часто десятилетия назад. Зачем тратить время выполнения во время анализа строки в медленном, но высоко продуктивном языке, как Python, если машина регулярной эксплуатации работает в самом Python? Вот почему в мире все еще есть C или C ++ и хардкорные мазохисты, готовые использовать эти языки.

Трудно анализировать или отлаживать: почему этот ‘& $%не работает? Почему я? Почему сейчас? Почему здесь?

Мы, кодеры, используем отладчиков каждый день, чтобы пройти через выполнение нашего кода. Что происходит в машине корпорации и почему шаблон проваливается в конце текста? Это совсем не прозрачно, поэтому вы продолжаете переписать шаблон, попробуйте еще раз, переписать, попробуйте ... так вы работали 50 лет назад на своей хорошо оплачиваемой работе в IBM.

После такого большого разочарования скоростью выполнения и создания шаблонов режима с множеством побочных эффектов и подводных камней, «но это работало вчера с другим текстом», когда дело доходит до сопоставления рисунков и поиска текста в тексте или его замены, есть ли инструмент 21-го века? Любой?

Я смотрел на выражения огурца, AGP-EXP и другие решения.
Совсем другой подход:СценарийПолем Это новое, только что подтолкнуло к нашему любимому GitHub, все еще курящим. Поиск одного персонажа в качестве начала совпадения - это самый быстрый метод, который вы можете найти. Он написан в C ++ для совместимости с другими языками и чистой скоростью. Scripal собирает исходный шаблон в быстрый байтовый код. Синтаксис ясно, что больше похоже на языки высокого уровня, мы используем каждый день. Scripal не использует сложную, внутреннюю переходную обработку, вы должны указать, что искать, и после первоначального матча может быть проверена предыдущая текстовая часть. Это просто другой подход к анализу.

Примеры:

Найдите все телефонные номера в формате NANP:

match find( '(' repeat[3]( digit ) ') ' repeat[3]( digit ) '-' repeat[4]( digit ))
end
loop

Найдите первое целое число в диапазоне от 1 до 200:

match find ( [1,200] )

У нас есть IPv4?

match (pure[0,255] ‘.’ pure[0,255] ‘.’ pure[0,255] ‘.’ pure[0,255] )

В большинстве случаев узоры Scripal намного проще, чем regex.

Информация отладки:

Установите переключатель отладки и посмотрите, как двигатель проходит через код.

 set operator ‘match’ at(0)
 start group
 set operator ‘null’ at(1)
 operator done: ‘null’ at(1)
 close operator..

Комментарии:

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

match ( ‘hdu-’ ) // match ‘hdu’ as start of identification string

Сходство:

Scripal может найти похожие слова и фразы, не используя шаблоны:

scripal -f 0.5 “test” “Find the word in testing”

Результат: «тест» в позиции 17 (в словах «тестирование») с ранг сходства 0,57142857. Значения сходства находятся в диапазоне 0 (без сходства) до 1 (равны)

Scripal может сравнить две строки и рассказать нам, насколько они похожи:

scripal -g 0.5 “Compare the text with any other” “Compare the text with something else”

вернет 0,857 как значение сходства для двух текстовых порций.

Unicode и интернационализация:

Scripal обладает полной поддержкой Unicode и принимает наиболее распространенные кодировки, такие как UTF-8, UTF-16, UTF-32, страницы кода Windows и другие. Он использует UTF-8, поэтому любой язык, поддерживающий UTF-8, получит максимальный эффект с алгоритмами поиска Scripal.

Классы персонажей и цифры:

Scripal имеет концепцию классов персонажей, вы можете сравниться с любой буквой, как в «Матч (буква)» или начало/конец слова, предложения, цифр и многого другого. Scripal знает арабские или китайские цифры, без проблем. Легко сопоставить число в диапазоне «[3,7]», даже в качестве шестигранного или двоичного числа.

Переменные и шаблоны:

Зачем повторять закономерности, часто встречающиеся в корпорации? Почему бы не иметь шаблоны для стандартных задач?

< roadMarker = { any( ~'avenue' ~'ave.' ~'road' ~'street' ~'boulevard' ~'drive' ~'lane' ) } >
match find( int[1,10000] blank repeat[1,3]( !( < roadMarker > ) word ) blank < roadMarker > ) 
ifMatch { 
  matchEnd ( ',' blank int[1,@] repeat[1,3]( blank word ) at any(',' eol eot ))
}

Здесь мы определяем Roadmarer и используем его для получения адреса, шаблона для поиска любого типа дороги, нечувствительный (~).

Вы можете сохранить результаты и использовать их позже, очень похожие на переменные.

name #code# // store match result
match find ( #code# ) // find next piece like last result

Универсальность:

Scripal поступает как библиотека C ++ и LIBS или модули для Node.js, Python, Java, C, C# для Windows и в основном любого дистрибутива Linux. Это также консольный двоичный / EXE, который можно мгновенно использовать, удобный инструмент для администраторов и DevOps. Его можно использовать для поиска файлов или фраз в файлах, что делает его хорошей альтернативой Grep, SED и AWK.

Скорость:

Время выполнения Scripal является линейным O (1) относительно входного размера, без горьких сюрпризов на более крупных строках. Вы можете оценить необходимое время процесса для данного максимального размера данных. Это может быть не быстрее, чем regex в любом случае, но время обработки примерно вычисляется.

Вердикт (виновен, ваша честь):

Scripal не является идеальным решением, вероятно, никогда не будет одного для сопоставления струн и анализа. Всегда будет граница, если задача слишком сложна, вы будете использовать строковые функции на своем языке программирования для сравнения или поиска шаблонов. Для анализа HTML, XML или JSON есть множество библиотек и инструментов. Использование Scripal или Regex для этой задачи не является оптимальным, хотя у Scripal есть несколько примеров для поиска данных в массивах JSON. Но для быстрого соответствия шаблонов в необработанном тексту, особенно в больших струнах и файлах, Scripal - это новая идея, настоящая альтернатива 70 -летней технологии.

Попробуйте, это больно гораздо меньше, чем regex.

Если вам интересно, посмотрите наhttps://github.com/scripal-git/scripal


Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE