Регулярные выражения

Russian main discussion
  • Author
  • Message
Offline
Posts: 294
Joined: Tue Jul 27, 2010 11:18 pm

Post by Serge Yolkin »

YuS
Сложно сказать, но я временно от правила 3 в экспериментах отказался именно из-за того, что с ним виснет часто (но не всегда).

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

YuS wrote: 2. Без расширения условий/ограничений, определить наличие двух и более раздельных регэкспов в одной строке, имхо, невозможно. Сейчас они будут захватываться все-в-одном, т.е. по сути будет один регэксп, заватывается текст от начального слеша до конечного...
Тут пришла в голову небольшая мысль... беру свои слова обратно. Вот вариант с определением нескольких регэкспов в строке:

Code: Select all

(?<=[:=!?&;|{\[(\n])[\x09\x20]*((?<![*+\\])/(?![*+?])(?:[^\[\\/]*+(\\\\)*+(\\\[)?+(?>\[|\\)?(?(3)[^\[\\]*+|[^\]]+\]))*+.*?(?<![^\\]/)/(?![^gim}\]),;:.\n ]))[gim]{0,3}[\x09\x20]*+(?![^}\]),;:.\n])
Но там есть, всё же, заковыка, будет время, попытаюсь её убрать...
Last edited by YuS on Fri Sep 26, 2014 1:36 pm, edited 1 time in total.

Offline
Posts: 294
Joined: Tue Jul 27, 2010 11:18 pm

Post by Serge Yolkin »

YuS
Э-э-э... Я еще предыдущую не доанализировал...
Прийдётся переваривать быстрее.

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

Offline
Posts: 294
Joined: Tue Jul 27, 2010 11:18 pm

Post by Serge Yolkin »

YuS
разбил последнее предложенное правило "в столбик", вот что получилось:

Code: Select all

(?<=[:=!?&;|{\[(\n])
перед искомым может быть ТОЛЬКО символ из набора :=!?&;|{[( или перевод (начало) строки
[\x09\x20]*
далее могут быть (или не быть) пробельные символы
(
  (?<![\*+])
  перед началом регулярки НЕ может быть символа * или +
  ?? но это, вроде, исключено предыдущими условиями ??
  /
  начало регулярки, логично, чёрт возьми
  (?![*+?])
  после начального прямого слэша НЕ может стоять квантификатор *+?
  похоже, третье правило разбили на несколько, но поскромнее
  (?:
  в то же время (без запоминания) далее идёт 0 или более последовательностей, состоящих из
    [^\[\\/]*+
    0 или более любых символов, кроме [\/
    (\\\\)*+
    далее может быть, или не быть четное число обратных слэшей (слэшов?)
    (\\\[)?+
    далее может быть, или не быть экранированная открывающая квадратная скобка
    (?>\[|\\)?
    далее ожидаем (но не обязательно) неэкранированную открывающую квадратную скобку или
    обратный слэш (???)
    (?(3)[^\[\\]*+|[^\]]+\])
    ?? вот тут, блин, ничо не понял (возможно, туплю), но, кажется,
    пропускаем то, что в квадратных скобках ??
  )*+
  всё это богатство может повторятся 0 или более раз
  .*?
  дальше — минимум чего попало
  (?<![^\\]/)
  перед концом не может быть другого неэкранированного прямого слэша
  /
  потом прямой слэш, вроде как, конец регулярки
  (?![^gim}\]),;:.\n ])
  э-э-э... двойное отрицание ?
  не ожидаем символа, не являющегося gim}],;:. или переводом строки
)
[gim]{0,3}
[\x09\x20]*+
(?![^}\]),;:.\n])
а теперь всё это ожидаем
в целом, кажется, понял, но надо много думать...

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

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, происходят падения и незначительные модификации не помогают, а значительные приводят к получению совсем другого варианта от требуемого... в общем, я завис и стек не освобождается, идеи пока закончились :)

Offline
Posts: 294
Joined: Tue Jul 27, 2010 11:18 pm

Post by Serge Yolkin »

YuS wrote:в файле кодера были другие влияющие правила...
сделал себе два файла: test.coder - пустой кодер-файл со всеми секциями и умолчательными строчками (теми, что определяют цвета из цветовых схем), но без правил Qutes, QutesRE и Folds а из расширений - только .test; второй - coder.test - в нём текст для проверки...
Тут условный шаблон: при выполнении условия работает первая часть шаблона с ИЛИ, при невыполнении - вторая. Условием является обратная ссылка на третью группу "(\\\[)?".
Вот за это разъяснение - огромное человеческое спасибо. Абсолютно новая для меня и весьма полезная информация. По наличию времени обязательно поиграюсь с условными шаблонами. Попадался этот термин в "отличиях от предыдущих версий", да всё руки не доходили.

YuS, несмотря на Вашу самокритику - большое спасибо за проделанную работу. Кажется, это был хороший пинок в правильном направлении. Дальше попытаюсь сам...

Offline
Site Admin
Posts: 6311
Joined: Thu Jul 06, 2006 7:20 am

Post by Instructor »

Serge Yolkin wrote:

Code: Select all

^\s*?(?:[^;])(\s*\S+)+
тоже завешивает насмерть...
YuS wrote:Вот ещё один сырой, но рабочий вариант, хотя для AP он чреват падением...
Тестовая

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

Instructor wrote:Тестовая
Спасибо! Совсем другое дело!!
Все попытки завешать AP закончилиcь неудачей...

YuS
Offline
Posts: 512
Joined: Sun Sep 15, 2013 8:25 am
Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы

Post by YuS »

Serge Yolkin wrote: Дальше попытаюсь сам...
Ну, вот теперь работает без запинок на тестовой версии AP 4.9.1 вот такой шаблон:

Code: Select all

0 "(?<=[:=!?&,;|{\[\(\n])[\x09\x20]*+(/(?![*+?])(?:(?:[^\[\\/]*+(?:\\\\)*+(?:\\\[|\\/|\\(?!\[))?)*+(\[)?(?(2)([^\]\\]*+(\\\\)*+(\\\]|\\(?!\]))?)*+((?<![^\\]\\)\])))*+.*?(?<![^\\]/)(?<![^\\]\\)/)[gim]{0,3}[\x09\x20]*+(?![^}\]\),;:.\n])" "\1=(2,${TYPE},0)"
Единственное условие, для правильного определения регулярки: слеш внутри регэкспа *.js, обязательно должен экранироваться. Т.о. неэкранированный слеш будет определяться либо как ограничитель шаблона регэкспа в скрипте (за исключением того случая, когда он в шаблоне находится внутри класса символов, тогда он не будет учитываться), либо, при наличии двух подряд идущих слешей, как комментарий.
Пример:
а) Не учитывается, т.к. внутри "[...]":

Code: Select all

/\\fgh[\[fgh/j\]]kl/
б) Учитывается, но по общим условиям, всё выражение не будет считаться регэкспом:

Code: Select all

/\\fg/h[\[fghj\]]kl/
В общем, сейчас для тестов нужны более сложные случаи шаблонов в js, для проверки корректности шаблона кодера.

Offline
Posts: 294
Joined: Tue Jul 27, 2010 11:18 pm

Post by Serge Yolkin »

YuS
Спасибо, только ближайшие несколько дней потестить не смогу - загрузили работой :(
Разберусь ближе к концу недели, в крайнем случае - на следующие выходные.

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

Необходимо в поиске с регулярными выражениями находить содержимое секции в INI файле, и далее переходить от секции к секции... раньше в 4.8.8 работало такое:

Code: Select all

^\[([^\[\]])+\](.*)^\[
Сейчас всё поменялось, как это выглядит сейчас?

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

Andrey_A_A
Можно попробовать вот так:

Code: Select all

^\[([^\[\]])+\](.*?)(?=^\[|\Z)

Offline
Posts: 670
Joined: Thu Jun 03, 2010 8:47 am
Location: Сочи, Хоста
Contact:

Post by Andrey_A_A »

Infocatcher, спасибо большое!

Offline
Posts: 171
Joined: Thu Dec 01, 2011 11:15 pm
Location: Россия

Post by LonerD »

Необходимо удалить (вначале разумеется найти, а потом удалить) все табуляторы и пробелы в начале строки (символы от начала строки до первого не-пробельного и не-табуляторного символа), даже если они идут вперемешку. Как это записать в регулярных выражениях?
Сделал вот так, но удаляются также пустые строки:

Code: Select all

^(\s)+|(\s)+$
Но удаляются также пустые строки, а этого не нужно делать.
Вот так - удаляется только последний блок символов...

Code: Select all

[(\t)+|( )+]$|^[(\t)+|( )+]

Offline
Posts: 1862
Joined: Mon Aug 06, 2007 1:07 pm
Contact:

Post by Infocatcher »

LonerD
Вот так можно:

Code: Select all

^[ \t]+|[ \t]+$
Или если только в начале строк:

Code: Select all

^[ \t]+
Post Reply