Регулярные выражения
- Author
- Message
-
Offline
- Posts: 512
- Joined: Sun Sep 15, 2013 8:25 am
- Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы
Тут пришла в голову небольшая мысль... беру свои слова обратно. Вот вариант с определением нескольких регэкспов в строке: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
YuS
разбил последнее предложенное правило "в столбик", вот что получилось:в целом, кажется, понял, но надо много думать...
разбил последнее предложенное правило "в столбик", вот что получилось:
Code: Select all
(?<=[:=!?&;|{\[(\n])
перед искомым может быть ТОЛЬКО символ из набора :=!?&;|{[( или перевод (начало) строки
[\x09\x20]*
далее могут быть (или не быть) пробельные символы
(
(?<![\*+])
перед началом регулярки НЕ может быть символа * или +
?? но это, вроде, исключено предыдущими условиями ??
/
начало регулярки, логично, чёрт возьми
(?![*+?])
после начального прямого слэша НЕ может стоять квантификатор *+?
похоже, третье правило разбили на несколько, но поскромнее
(?:
в то же время (без запоминания) далее идёт 0 или более последовательностей, состоящих из
[^\[\\/]*+
0 или более любых символов, кроме [\/
(\\\\)*+
далее может быть, или не быть четное число обратных слэшей (слэшов?)
(\\\[)?+
далее может быть, или не быть экранированная открывающая квадратная скобка
(?>\[|\\)?
далее ожидаем (но не обязательно) неэкранированную открывающую квадратную скобку или
обратный слэш (???)
(?(3)[^\[\\]*+|[^\]]+\])
?? вот тут, блин, ничо не понял (возможно, туплю), но, кажется,
пропускаем то, что в квадратных скобках ??
)*+
всё это богатство может повторятся 0 или более раз
.*?
дальше — минимум чего попало
(?<![^\\]/)
перед концом не может быть другого неэкранированного прямого слэша
/
потом прямой слэш, вроде как, конец регулярки
(?![^gim}\]),;:.\n ])
э-э-э... двойное отрицание ?
не ожидаем символа, не являющегося gim}],;:. или переводом строки
)
[gim]{0,3}
[\x09\x20]*+
(?![^}\]),;:.\n])
а теперь всё это ожидаем
-
Offline
- Posts: 512
- Joined: Sun Sep 15, 2013 8:25 am
- Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы
Шаблон формировался на скорую руку с помощью кодера и такой-то матери из-за периодических подвисаний, причем собирался в окончательный вариант частями. Кроме того, в файле кодера были другие влияющие правила, поэтому шаблон абсолютно не оптимизировался, а скорее подгонялся под работоспособность... в общем, если его проанализировать, то можно и нужно его ещё "доводить до ума". В нем не всё верно составлено, были другие варианты, где последовательный разбор больше подходит для перечисленных условий, но увы они вызывали стабильное зависание.Serge Yolkin wrote:YuS
разбил последнее предложенное правило "в столбик", вот что получилось:
Поэтому, комментарии к тому, что не вызывает сомнений опустим...
Code: Select all
...
(?>\[|\\)?
далее ожидаем (но не обязательно) неэкранированную открывающую квадратную скобку или
обратный слэш (???)
Code: Select all
(?(3)[^\[\\]*+|[^\]]+\])
?? вот тут, блин, ничо не понял (возможно, туплю), но, кажется,
пропускаем то, что в квадратных скобках ??
Code: Select all
(?![^gim}\]),;:.\n ])
э-э-э... двойное отрицание ?
Да, там ещё думать и думать, т.к. многое не учтено... но пока что это сложновато, т.к. попытка последовательного набора шаблона провалилась из-за падений AP и переполнения стекаSerge Yolkin wrote: в целом, кажется, понял, но надо много думать...
Вот ещё один сырой, но рабочий вариант, хотя для AP он чреват падением:
http://regex101.com/r/lK5oO5/1
при попытке включения чего-то подобного в AP, происходят падения и незначительные модификации не помогают, а значительные приводят к получению совсем другого варианта от требуемого... в общем, я завис и стек не освобождается, идеи пока закончились
-
Offline
- Posts: 294
- Joined: Tue Jul 27, 2010 11:18 pm
сделал себе два файла: test.coder - пустой кодер-файл со всеми секциями и умолчательными строчками (теми, что определяют цвета из цветовых схем), но без правил Qutes, QutesRE и Folds а из расширений - только .test; второй - coder.test - в нём текст для проверки...YuS wrote:в файле кодера были другие влияющие правила...
Вот за это разъяснение - огромное человеческое спасибо. Абсолютно новая для меня и весьма полезная информация. По наличию времени обязательно поиграюсь с условными шаблонами. Попадался этот термин в "отличиях от предыдущих версий", да всё руки не доходили.Тут условный шаблон: при выполнении условия работает первая часть шаблона с ИЛИ, при невыполнении - вторая. Условием является обратная ссылка на третью группу "(\\\[)?".
YuS, несмотря на Вашу самокритику - большое спасибо за проделанную работу. Кажется, это был хороший пинок в правильном направлении. Дальше попытаюсь сам...
-
Offline
- Site Admin
- Posts: 6311
- Joined: Thu Jul 06, 2006 7:20 am
Serge Yolkin wrote:тоже завешивает насмерть...Code: Select all
^\s*?(?:[^;])(\s*\S+)+
ТестоваяYuS wrote:Вот ещё один сырой, но рабочий вариант, хотя для AP он чреват падением...
-
Offline
- Posts: 512
- Joined: Sun Sep 15, 2013 8:25 am
- Location: 013 в Тентуре, семь по Спирали, налево от Большой Медведицы
Ну, вот теперь работает без запинок на тестовой версии AP 4.9.1 вот такой шаблон:Serge Yolkin wrote: Дальше попытаюсь сам...
Code: Select all
0 "(?<=[:=!?&,;|{\[\(\n])[\x09\x20]*+(/(?![*+?])(?:(?:[^\[\\/]*+(?:\\\\)*+(?:\\\[|\\/|\\(?!\[))?)*+(\[)?(?(2)([^\]\\]*+(\\\\)*+(\\\]|\\(?!\]))?)*+((?<![^\\]\\)\])))*+.*?(?<![^\\]/)(?<![^\\]\\)/)[gim]{0,3}[\x09\x20]*+(?![^}\]\),;:.\n])" "\1=(2,${TYPE},0)"
Пример:
а) Не учитывается, т.к. внутри "[...]":
Code: Select all
/\\fgh[\[fgh/j\]]kl/
Code: Select all
/\\fg/h[\[fghj\]]kl/
-
Offline
- Posts: 670
- Joined: Thu Jun 03, 2010 8:47 am
- Location: Сочи, Хоста
- Contact:
Необходимо в поиске с регулярными выражениями находить содержимое секции в INI файле, и далее переходить от секции к секции... раньше в 4.8.8 работало такое:
Сейчас всё поменялось, как это выглядит сейчас?
Code: Select all
^\[([^\[\]])+\](.*)^\[
-
Offline
- Posts: 1862
- Joined: Mon Aug 06, 2007 1:07 pm
- Contact:
Andrey_A_A
Можно попробовать вот так:
Можно попробовать вот так:
Code: Select all
^\[([^\[\]])+\](.*?)(?=^\[|\Z)
-
Offline
- Posts: 670
- Joined: Thu Jun 03, 2010 8:47 am
- Location: Сочи, Хоста
- Contact:
-
Offline
- Posts: 171
- Joined: Thu Dec 01, 2011 11:15 pm
- Location: Россия
Необходимо удалить (вначале разумеется найти, а потом удалить) все табуляторы и пробелы в начале строки (символы от начала строки до первого не-пробельного и не-табуляторного символа), даже если они идут вперемешку. Как это записать в регулярных выражениях?
Сделал вот так, но удаляются также пустые строки:
Но удаляются также пустые строки, а этого не нужно делать.
Вот так - удаляется только последний блок символов...
Сделал вот так, но удаляются также пустые строки:
Code: Select all
^(\s)+|(\s)+$
Вот так - удаляется только последний блок символов...
Code: Select all
[(\t)+|( )+]$|^[(\t)+|( )+]
-
Offline
- Posts: 1862
- Joined: Mon Aug 06, 2007 1:07 pm
- Contact:
LonerD
Вот так можно:
Или если только в начале строк:
Вот так можно:
Code: Select all
^[ \t]+|[ \t]+$
Code: Select all
^[ \t]+