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

Russian main discussion
  • Author
  • Message
Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

В текущей реализации регэкспов есть аналог модификатор (?m)?

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

Post by LonerD »

Infocatcher
Спасибо. Работает.

А можно через регулярные выражения удалить строки через одну?
У меня фантазии хватило только на поиск ^(.*)$\n^(.*)$\n и замены на $1\n . Разумеется, не работает.

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

Post by Infocatcher »

LonerD wrote:А можно через регулярные выражения удалить строки через одну?
Удалить четные:
^([^\n]*\n)([^\n]*\n?) => \1
Удалить нечетные:
^([^\n]*\n)([^\n]*\n?) => \2

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

Post by Instructor »

Skif_off wrote:В текущей реализации регэкспов есть аналог модификатор (?m)?
Да, см. AkelHelp-Rus.htm.

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

Post by LonerD »

Infocatcher
Спасибо.
Заменил несколько скриптов одним Multi_SR.js :)
По аналогии сделал
Дубль строк в виде [112233]
([^\n]*\n)([^\n]*\n?) => $1$1$2$2
А вот Дубль строк в виде [123123] что-то не получается.

Поискал, не смог найти - можно ли регулярными выражениями изменить порядок выделенных символов на обратный в пределах одной строки (а при наличии выделения в нескольких строках - обработать их по отдельности)?

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

Post by YuS »

LonerD wrote: По аналогии сделал
Дубль строк в виде [112233]
([^\n]*\n)([^\n]*\n?) => $1$1$2$2
А вот Дубль строк в виде [123123] что-то не получается.
Так это две совершенно разные задачи... в смысле вопрос был неточно составлен. Удалить четные/нечетные строки - одна задача, удалить дубликаты строк - совсем другая.
Дубликаты удаляются как-то так:

Code: Select all

Wath: (^[^\n]*\n)(.*)\1
With: \1\2
правда с некоторыми условностями:
1. Последняя строка в тексте не имеет \n, поэтому либо искусственно \Z (eof) переносим в следующую, пустую строку, либо составляем немного другую регулярку...
2. Т.к. некоторые дубликаты строк могут попасть в захватываемую часть \2, то поиск/замену придется осуществлять в несколько проходов.
LonerD wrote: Поискал, не смог найти - можно ли регулярными выражениями изменить порядок выделенных символов на обратный в пределах одной строки (а при наличии выделения в нескольких строках - обработать их по отдельности)?
Строго говоря, извращенным способом это можно сделать, но... уж очень некрасиво и ресурсоемко, например, для первых 1-15 символов в строке:

Code: Select all

Wath: ^([^\n])([^\n]?+)([^\n]?+)([^\n]?+)([^\n]?+)([^\n]?+)([^\n]?+)([^\n]?+)([^\n]?+)([^\n]?+)([^\n]?+)([^\n]?+)([^\n]?+)([^\n]?+)([^\n]?+)
With: \15\14\13\12\11\10\9\8\7\6\5\4\3\2\1
а для замены в любом месте, в том числе и в выделенной части нескольких строк, просто убираем символ начала строки и увеличиваем количество символов в выборке групп и их замену до необходимого...
в общем - маразм. Лучше использовать замену на функцию в SearchReplace.js

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Непонятное поведение с модификатором (?m) в 4.9.0 и 4.9.1 dev: отсюда и ниже. Так понял, в примере

Code: Select all

text1
text2
выражение (?m)^.*$ найдёт text1, а (?-m)^.*$ - всё. Или неправильно понял? В 4.8.9, кажется, получается так.

Заодно такой вопрос по другому модификатору возник: (?-s) касается только переноса строки \n или в т.ч. и возврата каретки \r? В справке новая строка, не совсем понятно.

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

Post by Instructor »

Skif_off wrote:Так понял, в примере

Code: Select all

text1
text2
выражение (?m)^.*$ найдёт text1, а (?-m)^.*$ - всё. Или неправильно понял?
(?m) указывать не нужно, т.к. он итак включен по умолчанию (см. AkelHelp-Rus.htm). Как уже было сказано неоднократно: с версии 4.9.0 квантификаторы регулярных выражений обладают классической жадностью, поэтому ^.*?$
Заодно такой вопрос по другому модификатору возник: (?-s) касается только переноса строки \n или в т.ч. и возврата каретки \r? В справке новая строка, не совсем понятно.
Любая новая строка.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Instructor
Так и задумывалось?

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

Post by YuS »

Skif_off wrote:Instructor
Так и задумывалось?
Может быть, задумывалось и не так, но в том случае, не совсем корректное регулярное выражение применяется, хоть и синтаксически верное. Два выражения для захвата неопределенного количества символа, причем стоящих рядом, в итоге обрабатываются корректно. Правда итог не такой, который был нужен составителю, но выход ведь есть - либо супержадный, либо ленивый квантификатор, т.е. в одном из шаблонов необходимо конкретно указать приоритет и тогда результат будет более ожидаемым.

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

Post by Instructor »

Skif_off wrote:Так и задумывалось?
В разрабатываемой версии файла помощи используется:
AkelHelp-Rus.htm wrote:TabNameFind=(.{20}).{3,}(?:\.([^.]*))?
TabNameRep=\1...\2

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

Post by YuS »

Instructor wrote:

Code: Select all

TabNameFind=(.{20}).{3,}(?:\.([^.]*))?
TabNameRep=\1...\2
Будет ли отображаться расширение в файлах с именами:
1234567890123456789.txt
12345678901234567890.txt
123456789012345678901.txt
1234567890123456789012.txt
?

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Instructor
Да, спасибо, почти сразу после коммита увидел и поставил.

YuS
У меня отображалось, пока не вспомнил, что в конфиге стоит TabNameFind=(.{25}) :))
Ваше предложение?
Пока сделал так

Code: Select all

TabNameFind=(.{25}).*(?:\.([^.]*))?
вроде работает.

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

Post by YuS »

Skif_off wrote: Ваше предложение?
Пока сделал так

Code: Select all

TabNameFind=(.{25}).*(?:\.([^.]*))?
вроде работает.
Ввиду того, что расширение тоже не ограничено количеством символов, то:

Code: Select all

TabNameFind=(?(^[^\n]{15,})([^.\n]{1,5}+)([^\n](?!\.[^.\n]+$))*+(.\.[^.\n]{1,4}+)?+([^\n]*?))
TabNameRep=\1...\3
Возможно, что шаблон можно и оптимизировать, но накидал его когда-то на коленке и то, что мне было необходимо вполне заработало, поэтому оптимизацией заниматься не стал:
1. мне было необходимо, чтобы последний символ перед расширением обязательно отображался
2. расширение отображается не более 4 символов, остальное отрезается.
3. файлы с наименованием вместе с расширением менее 15 символов, не сокращаются.

Offline
Posts: 1161
Joined: Sun Oct 20, 2013 11:44 am

Post by Skif_off »

Instructor
Возможно ли прикрутить к движку регэкспов поддерку \K, как в PCRE? Подозреваю, можно решить задачу с помощью (?=шаблон) или (?<=шаблон), но очень уж интересная штука...
Post Reply