Serge Yolkin wrote:YuS
разбил последнее предложенное правило "в столбик", вот что получилось:
Шаблон формировался на скорую руку с помощью кодера и такой-то матери из-за периодических подвисаний, причем собирался в окончательный вариант частями.

Кроме того, в файле кодера были другие влияющие правила, поэтому шаблон абсолютно не оптимизировался, а скорее подгонялся под работоспособность... в общем, если его проанализировать, то можно и нужно его ещё "доводить до ума". В нем не всё верно составлено, были другие варианты, где последовательный разбор больше подходит для перечисленных условий, но увы они вызывали стабильное зависание.
Поэтому, комментарии к тому, что не вызывает сомнений опустим...
Code: Select all
...
(?>\[|\\)?
далее ожидаем (но не обязательно) неэкранированную открывающую квадратную скобку или
обратный слэш (???)
Т.к. у нас шаблоном "[^\n\[\\]*+" захватывается не всё подряд, то для общего совпадения необходимо захватывать тот символ, перед которым остановился этот шаблон... тут ещё надо бы обмозговать ситуацию с сочетанием таких символов подряд, что я не анализировал...
Code: Select all
(?(3)[^\[\\]*+|[^\]]+\])
?? вот тут, блин, ничо не понял (возможно, туплю), но, кажется,
пропускаем то, что в квадратных скобках ??
Тут условный шаблон: при выполнении условия работает первая часть шаблона с ИЛИ, при невыполнении - вторая. Условием является обратная ссылка на третью группу "(\\\[)?".
Code: Select all
(?![^gim}\]),;:.\n ])
э-э-э... двойное отрицание ?
Не помню почему я добавлял эти отрицания, но они не мешали, поэтому и остались. А двойное отрицание: не должно быть любого символа не входящего в перечисленный набор... да, это было бы равнозначно (?=[gim}\]),;:.\n ]), но это собственно не так важно...
Serge Yolkin wrote:
в целом, кажется, понял, но надо много думать...
Да, там ещё думать и думать, т.к. многое не учтено... но пока что это сложновато, т.к. попытка последовательного набора шаблона провалилась из-за падений AP и переполнения стека

Вот ещё один сырой, но рабочий вариант, хотя для AP он чреват падением:
http://regex101.com/r/lK5oO5/1
при попытке включения чего-то подобного в AP, происходят падения и незначительные модификации не помогают, а значительные приводят к получению совсем другого варианта от требуемого... в общем, я завис и стек не освобождается, идеи пока закончились
