LINUX.ORG.RU

Есть ли читабельная замена регекспам или препроцессор из вмеяемых правил в регекспы?

 , , ,


1

3

Собственно суть в том, что хочется похожего функционала, только в виде последовательности вменяемых правил, а не «s/\/\/||/\?\\$%^@\?tygi/\*.[*-2]\HU\xwh8w\\n/||h9b03/\g» (примерно так выглядит чужой регексп).

Желательно в виде библиотек для явы, пхп (какашка, но иногда надо) и питона.

Не осилил regexp — ты неудачник. Программирование не для тебя. Смирись!

anonymous
()

Забей на регэкспы вообще, PEG лучше во всех отношениях. И не менее читаемый чем тупая BNF.

anonymous
()

PLY/pyparsing

Deleted
()
Ответ на: комментарий от nguseff

Во, годно. Есть что-нибудь типа этого, только с бОльшим функционалом?

AnyGov_security
() автор топика

AntLR утроит отца русской трансляции?

stevejobs ★★★★☆
()

http://www.antlr.org/

посмотри на глагне ярко красный бокс с надписью samples

еще с торрентов можно украсть неплохую книжку 2013 года производства

есть гуйня на основе эклипса, весьма полезная

есть куча всякой интеграции с джавой

есть куча уже сделанных парсеров

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

Литералов нет, есть многострочные re где можно делать комментарии

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

который зарабатывает «около 200к в месяц»?

anonymous
()
my $regex = qr<
  ^                 # line start
  (?<id>\d+)    \s+ # id
  (?<date>\S+)  \s+ # date
  [0-9a-f]{32}  \s+ # hash, undeened
>x;

идея надеюсь понятна.

anonymous
()

только в виде последовательности вменяемых правил

Да, есть такая система называется ЯП. А то, что ты заменишь емкие символы, на их более длинные названия - ничего не поменяется, когда тебе понадобится:

«s/\/\/||/\?\\$%^@\?tygi/\*.[*-2]\HU\xwh8w\\n/||h9b03/\g»

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

P.S. К тому же регэкспы также как и ЯП требуют форматирования, если они подразумевают сложное правило.

P.S.S. После того, как выучишь регэкспы, то вот такие вещи будут просты для понимания:

^(http:\/\/|https:\/\/)?(www.)?([a-zA-Z0-9]+).[a-zA-Z0-9]*.[a-z]{3}.?([a-z]+)?$
foror ★★★★★
()
Последнее исправление: foror (всего исправлений: 1)

Вот так можешь их форматировать:

    private static String tpl = "(?<exp>" 
                    + "export(?:"
                        // export * [from 'foo']
                        + "@*(?<ewildcard1>\\*)(?:@*from@*(?<efrom1>['\"].+?['\"]))?"

                        // export { foo1, foo2 } [from 'foo'];
                        + "|@*\\{(?<elist1>.*?)\\}(?:@*from@*(?<efrom2>['\"].+?['\"]))?(?:@*;)?"

                        // export function foo
                        + "|@+function@+(?<efunc1>ID)"

                        // export default foo =
                        + "|@+(?<default>default)"

                        // export [var] foo =
                        + "|@+(?<evar1>var@+)?(?<eassignment1>ID)@*="

                        // export foo from 'foo'
                        + "|@+(?<evariable1>ID)@+from@*(?<efrom3>['\"].+?['\"])"

                        // export [var] foo
                        + "|@+(?<evar2>var@+)?(?<evariable2>ID)" + ")"

                    + "|import(?:"
                        // import 'foo'
                        + "@*['\"](?<imodule1>.+?)['\"]"

                        + "|(?:"
                            // import { foo1, foo2 } from 'foo';
                            + "@*\\{(?<ilist1>.*?)\\}@*"

                            // import foo from 'foo';
                            + "|@+(?<ivariable1>ID)@+" + ")from@*(?<ifrom1>['\"].+?['\"])(@*;)?" + ")" + "|module(?:"

                    // module foo from 'core/foo'
                    + "[ \t]+(?<mvariable1>ID)@+from@*(?<mfrom1>['\"].+?['\"])" + ")" + ")";
foror ★★★★★
()

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

Второй вариант — ты решаешь задачу не тем инструментом, и скорее всего тебе нужен парсер, а не регэкспы.

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

Потому что он вырван из контекста, это не регулярка, это шаблон, в котором @, ID подменяются. К тому же это Java-ая регулярка и требует некоторых специфичных знаний описанных в javadoc-ах.

Чтобы после чтения javadoc-ов не осилить прочтение этой регулярки, даже не знаю тогда как вы пишите/читаете более сложные регэкспы...

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

К тому же это Java-ая регулярка и требует некоторых специфичных знаний описанных в javadoc-ах.

Напугал ежа голой жопой.

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

При прочих равных я бы разбил его на несколько кусков и матчил в несколько проходов или налабал элементарный PEG парсер.

даже не знаю тогда как вы пишите

Не пишу, это правда, регулярки должны быть очевидными с ходу без «бектрекинга»)

читаете более сложные регэкспы...

Если припрет и не такое разбирал. Просто этот чмонстр мой кодревью не пройдет.

A1
()

Если совсем невмоготу, можно вообще абстрагироваться от регулярок следующим образом. Замути Criteria с методом match(), CriteriaBuilder с соответствующими методами и вперед.

Например, нарисованный выше пример регулярки для распознавания URL (кстати, содержащей две ошибки) может выглядеть так:


CriteriaBuilder protocol = new CriteriaBuilder().startWith("http://").or().startWith("https://");

CriteriaBuilder optionalWwwDot = new CriteriaBuilder().equalTo("www.").zeroOrOne();

CriteriaBuilder bodyDot = new CriteriaBuilder().charAlphaNumeric().equalTo(".").oneOrMore();

CriteriaBuilder zone = new CriteriaBuilder().charAlpha().times(3);

Criteria url = protocol().optionalWwwDot().bodyDot().zone().build();

Если правильно расставит приоритеты операций, получится вполне читабельно.

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

Слишком жирно и к языку привязано. Выше давали более прикольные примеры библиотек.

AnyGov_security
() автор топика

В регулярках если указать модификаторы 'xs' то для наглядности можно указывать пробелы и переводы строк:

$pattern="/ 

     (?# нужно найти эту строчку qwe  )
    \\n qwe

     (?# забираем эту строчку  )
    \\n ([^\\n]+)

     (?# эта строчка zxc должна быть в конце  )
    \\n zxc

/xs";

$r=preg_match_all($pattern, $string, $matches);

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

Ненене. Дэвид Блейн, сам жри свои регулярки. Тут вверху нормальные вещи рекомендовали.

AnyGov_security
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.