last day (15 days later) » 

2:22 PM
0
Q: Помогите объединить регулярное выражение

IsaevПытаюсь сделать минипарсер формулы, на выходе должно быть 5 групп: (1)(2)(3)(4)(5) Есть 3 возможных варианта: Если после буква заглавная, то после неё может следовать 'w', вторая группа в этом случае пустая: ([2..3]?)()([ACD]{1})([w]?)([2']?) Во втором случае вторая и четвёртая группы всегд...

 
@wcobalt первое число 2 или 3, второе любое от 3 до 5
но, если первое 3, то второе от 4 до 5
 
Меня могут закидать помидорами, но для объединения выражений используют |. Необходимо учитывать порядок вариантов, чтобы предыдущий вариант не перекрывал текущий, который больше подходит для ситуации.
 
@Adokenai да, но сбивается номерация групп в этом случае... или есть какая-то хитрость неизвестная мне... Получается вот такая колбаса: regex101.com/r/gRnbTK/1 Всё бы ничего, но при первом вхождении у нас группы 1-5, как и хотелось бы, при совпадении со вторым вариантом группы 6-10, с третьим 11-17 (там вообще аномалия какая-то, группа без захвата, но нумерация идёт)
 
@Isaev Третья группа вообще нужна? Да и само построение выражения вызывает вопросы. Не понятны пустые скобки. вот как я переделал
 
@Adokenai третья группа нужна, она понимает выражения начинающиеся с двух чисел через тире, твой вариант их теперь не видит, и апострофы вконце тоже не видит... пустые скобки добавлены, чтобы найденные логические единицы попадали всегда в свою группу, т.к. иначе в каждом варианте количество групп разное, чтобы потом не встраивать логику в программу по выбору информации с разных мест на основе количества групп на выходе
 
2:22 PM
@Isaev Если не секрет, что за супер формулы такие?
 
@Adokenai из языка вращений шарнирных головоломок
 
@Isaev почитал о них. Чуть у самого шарниры не слетели. Регулярные выражения для парсинга не вижу необходимости объединять. Каждая команда должна рассматриваться отдельно и производить соответствующие действия. Объединение имеет смысл только при проверке синтаксиса, по-моему.
 
я сначала так и пытался сделать, но тут, наверное, как раз проверка синтаксиса больше подходит для моей задачи...
Оно в общем работает, только довольно громозко выглядит и я пока не понял как границы формул можно обозначить...
т.е. например 3-2l успешно распознаётся, как 2l т.к. начало не подходит по регулярке, а должно вообще не распозначаться... граница слова тут тоже не работает, т.к. - отделяет границу слова)
 
В Perl можно использовать модификатор /x и добавлять комментарии. Ретроспективная проверка. Квантификаторы ? и * совпадают всегда(!). Поэтому нужно более чётко описывать совпадения.
 
ну и нумерацию групп можно ли для каждого варианта с нуля сделать чтобы считалась... этот момент я не помню вообще
да, про ретроспективные проверки надо будет освежить, как раз что нужно вроде там было
 
2:38 PM
Нумерация сквозная, поэтому объединение и выдаёт группы 6..10 и т.п. При написании парсера (PHP, для EPG) я искал слово (можно символ), который начинает последовательность, а потом прогонял по if-ам с различными вариантами. Всё в кучу - чаще плохая идея. Тут не выражение, а сам алгоритм нужен, а это уже другая история.
 
https://i.imgur.com/ndm3ZRM.png
тогда по сути только вот эти 2 проблемы в первом прямоугольнике остались...
что в середине текста ищет... даже это одна и та же проблема.
"Нумерация сквозная, поэтому объединение и выдаёт группы 6..10 и т.п. "
да я уже понял, просто думал это можно как-то настроить стандартными методами... по большому счёту не так страшно, вытащу из многих
спасибо за наводку, пойду проверки повторять)
 
2:59 PM
получается нужно (?<=^|\s) вставить в начале каждой проверки? т.е. 6 раз?
 
3:57 PM
{1} для класса == класс
[w]? == w?
Для двух символов использовать диапазон бессмысленно.
Хотя уверен, что выражение можно сильнее оптимизировать, но мне лень.
 
логично, спасибо поправил
 

last day (15 days later) »