LINUX.ORG.RU

grex 1.4.0 — генератор регулярных выражений

 , ,

grex 1.4.0 — генератор регулярных выражений

2

2

Обновилась утилита для создания регулярных выражений — grex 1.4.0. В новой версии исправлены ошибки, обновлена поддержка Unicode 14, крупным изменением стала возможность компиляции в WebAssembly и теперь grex можно использовать в браузере и Node.js (автор собрал NPM-пакет).

Посмотреть работу grex без установки можно на демо-странице: https://pemistahl.github.io/grex-js/

>>> Подробности

★★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 2)

Назначение я так понимаю - ускорить написание регулярок. Класс!

xor2003
()

А сразу несколько примеров как задать? Понял - через пробел

xor2003
()
Последнее исправление: xor2003 (всего исправлений: 1)

Теперь нечитаемые загогульки будут генерироваться в промышленных масштабах =)

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от urxvt

А если ему скормить 1000 email’ов оно сгенерит правильный email-валидатор?

Думаю, сгенерит. Но только для этих самых 1000 мейлов))

Ну или скормить наиболее разнообразные, чтобы покрыть как можно больше кейсов)

skyman ★★★
()
Последнее исправление: skyman (всего исправлений: 1)
Ответ на: комментарий от urxvt

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

shell-script ★★★★★
()
Ответ на: комментарий от shell-script

Не-е-е-т, такой хоккей^Wgrex нам не нужен!

urxvt ★★★★★
()

Дичь какая, это математически нерешаемая задача. Скрин и ссылка доставили отдельно.

Anoxemian ★★★★★
()

интересно, для webassembly и в целом для websocket есть что-либо серверное, помимо node.js?

Ужасает это джаваскриптовый монстрик, но как ни увижу что-либо динамическое, это всегда на нем.

AVL2 ★★★★★
()

еклмн ну и кривость он генерит. проще прочитать небольшой ман по регуляркам.

bernd ★★★★★
()
Ответ на: комментарий от Oldboy

есть еще анимированные png. с подключением!

bernd ★★★★★
()

Осуждаю

Тащемта, лучшая характеристика:

This project has started as a Rust port of the JavaScript tool regexgen written by Devon Govett.

perl5_guy ★★★★★
()
Последнее исправление: perl5_guy (всего исправлений: 1)

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

Получить заготовку и потом допилить напильником.

От знания синтаксиса регулярки не освобождает.

И ты никогда не будешь уверен, что именно он сгенерил, какие еще шаблоны подойдут.

blex ★★★
()
Ответ на: комментарий от skyman

Ну или скормить наиболее разнообразные, чтобы покрыть как можно больше кейсов)

И получить регулярку «.*»

monk ★★★★★
()
Ответ на: комментарий от dataman

С ключом -r генерит.

Таки да, спасибо.

iron ★★★★★
()

Забавная игрушка. Надо будет побаловаться.

WatchCat ★★★★★
()
Ответ на: комментарий от skyman

скормить наиболее разнообразные, чтобы покрыть как можно больше кейсов)

Полумеры. Чтобы всё было правильно, надо скормить все возможные email’ы.

apt_install_lrzsz ★★★
()
Ответ на: комментарий от urxvt

aa@x.com bb@x.com ab@x.com ba@x.com cc@x.com ac@x.com ca@x.com bc@x.com cb@x.com

превращает в

^[a-c][a-c]@x\.com$

Но если в исходной выборке случайно пропустить пару вариантов cc@x.com ac@x.com, то

^(?:b[a-c]@x\.com|[ac][ab]@x\.com)$

Т.е. «скормить 1000 емейлов» не сработает. Надо все возможные email-ы указать. Проще самому регулярку написать

Aswed ★★★★★
()

grex можно использовать в браузере и Node.js

Хочу в сонсоли!

Gonzo ★★★★★
()

Есть язык Red (и его прородитель Rebol) в которых вместо регулярок используется полноценный dsl встроенный в язык что намного мощнее, читабельнее, и вроде не сильно уступает по скорости. Например:

four:     charset "01234"
half:     charset "012345"
non-zero: charset "123456789"
digit:    union non-zero charset "0"

byte: [
      "25" half
    | "2" four digit
    | "1" digit digit
    | non-zero digit
    | digit
]
ipv4: [byte dot byte dot byte dot byte]

parse "192.168.10.1" ipv4

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

parse data [some [copy value ipv4 | skip]]
loz ★★★★★
()
Последнее исправление: loz (всего исправлений: 4)

пейсать write-only код теперь еще легче. слава роботам!

dummy ★★
()
Ответ на: комментарий от AVL2

Ты имеешь в виду серверную часть, которая с этими самыми вебсокетами работает? Ну у нас это на питоне сделано, например, на aiohttp.

leave ★★★★★
()

Что только наркоманы не придумают, лишь бы в регулярку не учиться ...

windows10 ★★★★★
()
Ответ на: комментарий от Aswed

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

muon ★★★★
()
Ответ на: комментарий от muon

Так оно собрано без libastral

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

Aswed ★★★★★
()
Ответ на: комментарий от muon

Я имел в виду хороший.

package main

import "net/url"

func IsURL(test string) bool {
	_, err := url.Parse(test)
	return err != nil
}

ПС. Исправлено, чтобы соответствовать канонам гошки

her_s_gory
()
Последнее исправление: her_s_gory (всего исправлений: 1)

автор собрал NPM-пакет

И ты, Брут, продался большевикам…

pihter ★★★★★
()
Ответ на: комментарий от AVL2

в целом для websocket есть что-либо серверное, помимо node.js?

Я видел на го написанную единобинарную утилиту, её запускаешь - она хостит ws порт. Всё что приходит - вываливается на stdout, все что ей кормишь на ввод - шлёт в сокет. Профит

pihter ★★★★★
()

Очередной никому не нужный высер на расте.

pascal ★★★
()

Жаль что оно не умеет уже готовую регулярку считать, и показать verbose для неё, или что-то вроде explain, как у regex101, где видно какая группа какую инфу захватывает, и т.п.

lucentcode ★★★★★
()
Ответ на: комментарий от leave

Спасибо, как раз примерно то, что искал.

AVL2 ★★★★★
()

Как скормить ему логи, чтобы получить набор правил для egrep ?

kt
()
Ответ на: комментарий от loz

Есть язык Red

Дети писяли от счастья...

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

Ржунимагу! Фича... нет, УНИКАЛЬНАЯ ФИЧА!!!

ВЫ издеваетесь?

Attila ★★
()

Какая-то непрактичная херня. Я ей скормил 10 строк по 100КБ каждая (т.е. весь файл примерно 1МБ), она вот уже 16 минут грузит 1 ядро на 100%, но все никак. Я бы за это время сам все сделал. На 20-й минуте мне надоело, и я ее тормознул.

Может попробовать отключить ей оптимизацию DFA? или она тогда выдаст что-то совсем нечитаемое?

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

a--
()
Последнее исправление: a-- (всего исправлений: 7)
Ответ на: комментарий от Attila

Ржунимагу! Фича… нет, УНИКАЛЬНАЯ ФИЧА!!!

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

loz ★★★★★
()
Ответ на: комментарий от loz

именованные группы в регексах есть, похоже, везде (в перле и питоне скажем)

perl -we 'print $+{foo} if "aaa" =~ /(?<foo>a*)/'

произвольный код в регексах в perl есть точно, в других от РНР до С++ — возможно что тоже есть, но я не юзаю в них мощные регексы

в перле так же есть возможность делать динамически-локальные переменные внутри регексов, чтобы при бэктрекинге они затирались; но если надо, то можно сохранять их в нелокальные; в red так можно?

твой byte может определяться через себя же (рекурсивно)?

дальше пересказ твоего кода с простейшим подсчетом

#!/usr/bin/perl -w

my $count = 0;

my $four=qr/(?:[01234](?{ ++$count }))/;
my $half=qr/[012345]/;
my $non_zero=qr/[123456789]/;
my $digit=qr/(?:$non_zero|0)/;
my $dot=qr/[.]/;

my $byte=qr/
      2         5      $half
    | 2         $four  $digit
    | 1         $digit $digit
    | $non_zero $digit
    | $digit
/x;

my $ipv4 = qr/(?{ $count=0 })$byte $dot $byte $dot $byte $dot $byte/x;

print "four matched $count times\n" if "222.238.10.1" =~ $ipv4;
print "four matched $count times\n" if "192.238.10.1" =~ $ipv4;
print "four matched $count times\n" if "192.188.10.1" =~ $ipv4;
a--
()
Последнее исправление: a-- (всего исправлений: 1)
Ответ на: комментарий от a--

произвольный код в регексах в perl есть точно, в других от РНР до С++ — возможно что тоже есть, но я не юзаю в них мощные регексы

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

но если надо, то можно сохранять их в нелокальные; в red так можно?

Не совсем понимаю что такое локальные/нелокальные, в red это просто обычные переменные. Бек-трекинга по-сути нету, парсинг в реде это в целом PEG с дополнительными фичами.

твой byte может определяться через себя же (рекурсивно)?

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

loz ★★★★★
()
Ответ на: комментарий от loz

В перловых регексах произвольный код очень давно (чуть ли не 20 лет).

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

1. Ты можешь сказать, что функций недостаточно, нужны лямбды — но там этот вопрос (передача окружения) тоже очевидно решается.

2. Реентерабельна ли регекс-engine? Я бы не стал на это рассчитывать. Т.е. в «произвольном коде» регексы уже использовать нельзя. В доках наверно про это молчат — а это ведь баг доков.

ЕМНИП там даже user-defined функции для sqlite можно писать на питоне. С одной стороны смешно, а с другой стороны языковый интероп это все же позитивно.

На остальные моменты еще отвечу.

a--
()
Последнее исправление: a-- (всего исправлений: 1)
Ответ на: комментарий от loz

Что касается синтаксиса: конечно, в перле куча лишних закорючек, а в реде явно чище.

Однако не ясно, как (по какому принципу) расставляются скобки. Например, как вот это:

digit:    union non-zero charset "0"
условного говоря превращается в вот это:
digit = union(non_zero, charset("0"))
а не в это
digit = (union(non_zero), charset("0"))
или в это
digit = union(non_zero(charset("0")))
или даже в это
digit = union(non_zero, charset, "0")

a--
()
Последнее исправление: a-- (всего исправлений: 3)
Ответ на: комментарий от a--

В red особый подход ко многим вещам, он основан на Rebol а не на других более распространенных языках того времени. Автор Rebol собственно в начале нулевых посмотрел на перл, питон и решил что может сделать намного лучше, и некоторые вещи получились действительно инновационные.

Однако не ясно, как (по какому принципу) расставляются скобки

Все просто - по количеству аргументов, charset принимает 1, union - 2. Это вызывает вопросы по-началу но делает код довольно читабельным в итоге. По-умолчанию все «переменные» вычисляются а функции выполняются, чтобы передать саму функцию надо взять ее «значение» из переменной например print :union

loz ★★★★★
()
Последнее исправление: loz (всего исправлений: 3)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.