|
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
|
|
Своя реализация регулярных выражений. Реалити разработка, как говорится учитесь пока я жив :)16.06.2024, 15:01. Показов 3858. Ответов 21
Метки нет (Все метки)
Итак, для разработки своих будущих проектов мне нужен быстрый парсинг с удобным для меня функционалом. Есть же регулярные выражения скажете вы, да есть, но тоже самое можно сделать намного проще и удобнее и это я вам докажу в этой теме. Кроме того при использовании регулярных выражений из стандартной библиотеки подключаются куча всего разного, что увеличивает исходный код ну и скорость я думаю от этого тоже замедляется. Короче споры тут не уместны я приступаю к разработке своей реализации регулярных выражения на Rust.
На разработку может уйти некоторое время, т.к. я только начинаю писать на Rust, приходится попутно всё изучать, кроме того у меня есть и другие дела, проекты, так же при решении тех или иных микро задач будут возникать трудности, которые я обычно обдумываю занимаясь другими делами, даже когда отдыхаю, смотрю например кино и тд., мне может придти мысль как что можно сделать и затем проверяю это, поэтому всё будет делаться по мере возможности. Но думаю за пару месяцев +- управлюсь. Назову модуль пока notch, потом название возможно поменяется. Первоначально надо придумать синтаксис для поиска подстрок: > - начало строки, в начале(как^); < - конец строки, в конце(как $); s - пробел(как \s); t - табуляция(как \t); n - (NL) новая строка(как \n); c - (CR) возврат каретки(как \r); i - число integer(как \d); f - число с точкой float; l - буква(как \w); L - заглавная буква; w - слово; W - слово заглавными буквами; m - спецсимвол; a - любой символ(как .); {text} - конкретный текст; [zzz] - возможные совпадения(подразумевается "или"), где zzz - шаблон; (zzz) - захват подстроки, где zzz - шаблон; * - ноль или более раз повторов; + - один или более раз повторов; *n - ноль или более раз, но не более n; +n - один или более раз, но не более n; :n - где n - количество раз повторов; ! - отрицание совпадения; | - или; ?zzz? - проверка, где zzz - шаблон #n - захваченная подстрока Данный синтаксис придумал только что при написании этого сообщения, возможно потом поменяю, что-то добавлю... Я сделал так чтобы было без использования управляющих символов \n,\r,\s,\w и тд. а использовались простые буквы, ведь это просто шаблон, в котором мы можем описать искомые символы своими значениями и синтаксисом для логики. Старался сделать так чтобы было привычно и более удобнее чем в существующих регулярных выражениях. Правда есть нюанс. Как указывать конкретный спецсимвол который используется в синтаксисе шаблона: *+:!|?#(){}[] Я над этим вопросом ещё подумаю, может выбрать какой либо спецсимвол после которого писать нужный, например ~: ~({нужный ~{мне~} текст}~) - то есть будет искаться "(нужный {мне} текст)" в круглых скобках с фигурными внутри конкретного текста ~#[iL]:4 - что будет соответствовать "#00AB" двухбайтному числу в шестнадцатеричной форме возможно так и сделаю, но это не точно
1
|
|
| 16.06.2024, 15:01 | |
|
Ответы с готовыми решениями:
21
Реализация алгоритма поиска в http ответе с помощью регулярных выражений Как оптимизировать применение регулярных выражений
|
|
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
|
|||
| 16.06.2024, 15:38 [ТС] | |||
|
0
|
|||
|
Супер-модератор
|
|||||
| 16.06.2024, 16:08 | |||||
|
pgb, 1) не надо высокомерно хамить 2) из описания не видно, что "намного проще"... Впрочем, возможно. Но только ценой потери части стандартных возможностей регэкспов. Если вы реализуете только "поиск подстрок", то это всего лишь часть функций регулярных выражений. В любом случае сказать, что "намного проще" вы можете только в случае демонстрации десятка-двух сопоставляющих примеров:
- вот стандартное решение (видите, как громоздко!) - а вот мое решение (видите, как коротко и просто!) ![]() ![]() Итог: реализуйте и сравнивайте со стандартными решениями. Получится - прекрасно... Флаг в руки.
9
|
|||||
|
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
|
|||||||||||||||||
| 16.06.2024, 22:29 [ТС] | |||||||||||||||||
|
Получение токенов шаблона, пока черновой вариант. Есть баг при использовании +, другие пока не проверял. Так же есть мысли по улучшению кода.
Вопрос: Как вернутся назад на один символ в итераторе std::str::Chars? Добавлено через 2 часа 31 минуту Улучшенный код получения токенов шаблона
Ещё немного улучшил, прогрессирую в отличие от тех кто в меня свои какашки кидают..
![]() Добавлено через 12 минут Так что не вам меня судить, сами ни на что не способны, а осуждают..
0
|
|||||||||||||||||
|
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
|
|
| 16.06.2024, 23:51 [ТС] | |
|
*********
0
|
|
|
Заблокирован
|
|
| 21.06.2024, 12:44 | |
|
Любят у нас люди человека опустить. Из зависти одной только любят.
Ну сделал человек что-то, ну хочет поделиться своими эмоциями. Так нет, надо в него обязательно плюнуть...
0
|
|
|
Супер-модератор
|
|
| 22.06.2024, 06:53 | |
|
Гай, не так. Человек выступил очень претенциозно (одно "учитесь, пока я жив" чего стоит...) Но тему выбрал серьезную и очень хорошо проработанную теоретически. Там трудно сказать что-то по-настоящему новое. Ему на это и указали.
Лично я всегда приветствую любую нетривиальную инициативу. Вдруг, действительно получится что-то стоящее.
1
|
|
|
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
|
|||
| 22.06.2024, 08:42 [ТС] | |||
|
Итак, я решил переделать парсинг токенов, шаблон будет состоять из конкретного текста для поиска, а для логики и синтаксиса буду использовать символ '~' после которого уже будут идти другие символы, которые будут указывать что нужно находить. Сейчас этим и займусь.
0
|
|||
|
|
||
| 22.06.2024, 08:55 | ||
|
5.22
Всё это зафиксировано в его сообщениях на форуме.
0
|
||
|
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
|
||
| 22.06.2024, 09:12 [ТС] | ||
|
ЗЫ. Собаки лают, караван идёт
0
|
||
|
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
|
||
| 22.06.2024, 21:15 [ТС] | ||
|
Оставляю как было с некоторыми правками синтаксиса: a - любой символ(как .); b - начало строки, в начале(как^); c - (CR) возврат каретки(как \r); d - цифра 0..9(как \d); e - конец строки, в конце(как $); f - число с точкой float; g - true или false; h - шестнадцатеричное число; i - число integer; j - ; k - ; l - строчная буква; m - захваченная подстрока; n - (NL) новая строка(как \n); o - или; p - запомнить текущую позицию; q - кавычки " или '; r - количество раз повторов; s - пробел(как \s); t - табуляция(как \t); u - заглавная буква; v - проверка, vzzzv, где zzz - шаблон; w - слово; x - отрицание совпадения; y - ; z - спецсимвол; {text} - конкретный текст; [zzz] - возможные совпадения(подразумевается "или"), где zzz - шаблон; (zzz) - захват подстроки, где zzz - шаблон; * - ноль или более раз повторов; + - один или более раз повторов; Опять же это не окончательный вариант, поэтому код под этот синтаксис не буду сейчас выкладывать, а буду пока тестировать как что будет определятся и тд. Как буду уверен в таком решении, выложу доработанную функцию парсинга токенов выражения, потом буду двигаться дальше, писать функцию поиска в строке по выражению. ЗЫ. Надо что-то придумать для букв j,k,y какие-то назначения
0
|
||
|
Просто Лис
|
||
| 23.06.2024, 09:59 | ||
|
Вызов panic в коде это прям эпично.
Значения ваших не-регулярок известны на момент компиляции? Тогда можно написать макрос, который в compile-time строит конечный автомат и генерирует функцию. Я почти уверен, что уже существуют подобные библиотеки на расте. Плюсы: должно работать быстро и не тянет runtime зависимостей в проект. Добавлено через 3 минуты https://docs.rs/hitori/latest/hitori/
Хм, пишут, что макрос regex! из стандартной библиотеки тоже complie-time. Аж с 2014 года…
0
|
||
|
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
|
||
| 23.06.2024, 10:46 [ТС] | ||
|
Это всё пока ещё обдумывается. Первоначально надо саму реализацию сделать, доработать всегда можно, что-то улучшить и тд., когда своя реализация-то, в этом и есть самый большой плюс своей реализации в отличие использования сторонней.
0
|
||
|
Просто Лис
|
||||||
| 23.06.2024, 10:54 | ||||||
|
Но ведь токенайзер (лексер) пишется проще и ему не очень-то нужны регурярки чтобы разбирать исходный код…
Добавлено через 2 минуты Во вообще грамматику можно описать, не написав ни строчки кода:
ANTLR
2
|
||||||
|
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
|
||
| 23.06.2024, 11:06 [ТС] | ||
|
Но у меня решение которое отличается от обычных, я делаю по другому и тут нужны другие подходы, я могу написать свою реализацию, и я использую Rust компилируемый язык в машинный код чтобы реализация была как можно чище без кучи сторонних библиотек и прочего. ЗЫ. Короче я устал всем одно и тоже объяснять. Почему бы вам уже не успокоится и перестать ссылаться на готовые решения, а включать свои мозги для решения каких либо задач?
0
|
||
|
Просто Лис
|
|
| 23.06.2024, 11:10 | |
|
0
|
|
|
-508 / 32 / 0
Регистрация: 22.09.2015
Сообщений: 1,232
|
||||
| 23.06.2024, 11:17 [ТС] | ||||
|
Из вашего же примера
![]() Так я первым же делом это просканировал, посмотрел что и как, именно поэтому и решил, что они мне не подходят и что хочу сделать по своему. ЗЫ. Когда же вы успокоитесь-то со своими ссылками на готовые решения, а начнёте включать свой мозг?
0
|
||||
| 23.06.2024, 11:17 | |
|
Помогаю со студенческими работами здесь
20
Объясните, как работает грамматика регулярных выражений ECMAScript
Как с помощью регулярных выражений можно разделить строку на подстроки? Как преобразовать текстовый файл в html с помощью регулярных выражений? Как преобразовать текстовый файл в html с помощью регулярных выражений? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
*/
#include <iostream>
#include <stack>
#include <cctype>. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|