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

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

Post by YuS »

Skif_off wrote: Возможно ли прикрутить к движку регэкспов поддерку \K, как в PCRE?
Где-то тут уже просил/предлагал ввести этот шаблон... но либо неубедителен был со своей просьбой, либо пример использования не привел... уже не помню точно.

Попробую привести пример использования. Откуда взял пример, тоже не помню, но пример хороший, особенно, если массив текста будет большим...

Есть массив текста в котором встречается, например ссылка _http:\\serv134.en.prizee.com
Нам надо постараться выражением выделить только цифры после serv.

Если написать интуитивно понятное правило
serv\d+\.en\.prizee\.com
то результатом будет serv134.en.prizee.com
Но нам ведь нужны только цифры. Как их выделить?

\K делает так, что все то, что находится до нее, в итоговую подстроку не попадает.
Т.е. правило serv\K\d+\.en\.prizee\.com
оставит в итоге только 134.en.prizee.com
Уже ближе.

(?=...) позволяет заглянуть дальше по строке вперед и проверить, есть ли там то, что указано в скобках после ?=. Но это что-то хоть и проверяется, но в итоговую строку не пишется.
Получается, serv\K\d+(?=\.en\.prizee\.com)
вернет нам serv134.en.prizee.com за вычетом того, что находится до \d+ и после \d+, т.е. только нужные цифры 134.
Skif_off wrote:Подозреваю, можно решить задачу с помощью (?=шаблон) или (?<=шаблон), но очень уж интересная штука...
Не просто интересная, но и необходимая в некоторых случаях, т.к. существующий просмотр назад имеет ограничение, т.е. шаблон должен быть фиксированным, а \K позволяет не учитывать в итоговой строке всё, что было найдено до необходимого шаблона, в вышеприведенном примере это \d+, причем без каких-либо ограничений...
Да, одну и ту же задачу можно решать разными способами, но если есть способ попроще, то почему бы им не воспользоваться...
Правда в реализации каких-либо идей, есть кроме желаний пользователей ещё и другие факторы влияющие на сам факт реализации: это и мнение автора программы, и наличие свободного времени у него, и естественно, возможность программной реализации в принципе. Пока не видел отрицания того, что это возможно реализовать, так что будем подождать, может всё таки, когда-нибудь сойдутся все факторы в одном месте... :)

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

Post by Instructor »

Skif_off wrote:Возможно ли прикрутить к движку регэкспов поддерку \K, как в PCRE?
Тестовая

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 »

Instructor wrote:Тестовая
Во! Собрались таки все факторы в одном месте :)

Работает отлично, глюков и тормозов не замечено.

Пример теста:
Что: .*?(?:vers|fersa|[a-f]{4,6})\K\d+(?=\.en\.prizee\.com)
Чем: 88888

http:\\serv134.en.prizee.com
http:\\serv134.en.prizee.com
http:\\serv134.en.prizee.com
http:\\serv134.en.prizee.com cvbn http:\\vers134.en.prizee.com dfrt http:\\fersa134.en.prizee.com
http:\\serv134.en.prizee.com werty http:\\vers134.en.pizee.com vbnm http:\\fersa134.en.pizee.com
http:\\abcd134.en.prizee.com mnb http:\\abcde134.en.prizee.com rtyu http:\\abcdef134.en.prizee.com

Меняет ровно там, где задумывалось, в пяти местах... и в других тестах придраться не к чему было.
Спасибо!

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

А почему поиск [^\x00-\x7F] или [^\x01-\x7F] находит символ перевода строки?? (AkelPad 4.9.3)

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

Post by Instructor »

DV
Новая строка - это особо обрабатываемый символ.

[^\n\x00-\x7F]

DV
Offline
Posts: 1250
Joined: Thu Nov 16, 2006 11:53 am
Location: Kyiv, Ukraine

Post by DV »

Есть предложение добавить в настройки AkelPad галочку

(RegExp) символ . может быть переносом строки

или же добавить следующий (ручной) параметр:

Code: Select all

RegExp_Dot = [^\n]
Смысл параметра в том, чтобы можно было настраивать интерпретацию символа . при поиске. Например, я обычно трактую его как любой символ, кроме переноса строки.
Думал было добавить такую возможность в QSearch, но такое локальное решение мне не нравится из-за того, что тогда поиск в QSearch и в AkelPad будут давать разные результаты, что крайне нежелательно.

P.S.
Аргументацию такой настройки я вижу в том, что напечатать, например,
.+?
во-первых, быстрее, а во-вторых, интуитивнее, чем
[^\n]+?

KDJ
Offline
Posts: 1949
Joined: Sat Mar 06, 2010 7:40 pm
Location: Poland

Post by KDJ »

DV
AkelHelp-Eng.htm wrote:(?s) dot '.' matches any single character (default).
(?-s) dot '.' matches any single character, except newline character.

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

Post by LonerD »

Подскажите регулярное выражение, которое делает одновременно следующие две операции:
1) удаляет один пробел в начале каждой строки (только один пробел);
2) удаляет все пробелы и табуляции в конце каждой строки.
Назначение - "очистка" скопированного из браузера скрипта от мусорных символов :roll:

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

LonerD
Я выделяю всю, кроме первой строки (она без сдвига) и делаю Shift+Backspace, затем вызываю команду:

Code: Select all

"Убрать пустые символы В КОНЦЕ	Alt+Backspace" Command(4174)
А вообще лучше не выделять и копировать вручную, а нажать на надпись "код", он выделит без начальных пробелов. Останется только почистить в конце строк (вроде как).

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

Post by YuS »

LonerD wrote:Подскажите регулярное выражение, которое делает одновременно...
Примерно так:

Code: Select all

Что: (^ )|([\t ]*(?=$))
Чем:

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

Post by LonerD »

YuS wrote:

Code: Select all

Что: (^ )|([\t ]*(?=$))
Чем:
Спасибо. То, что нужно :idea:
VladSh wrote:Я выделяю всю, кроме первой строки (она без сдвига) и делаю Shift+Backspace, затем вызываю команду 4174
Я тоже так делал. Потом комбинировал несколько команд через Eval.js. Но если можно максимально упростить - то лучше упростить )))
VladSh wrote:А вообще лучше не выделять и копировать вручную, а нажать на надпись "код", он выделит без начальных пробелов.
Нажатие на надпись "Код" и последующее копирование выделенного даёт и начальные и конечные пробелы (во всяком случае на классической Опере). Да и копировать приходится с разных сайтов.

Offline
Posts: 3217
Joined: Wed Nov 29, 2006 1:19 pm
Location: Киев, Русь
Contact:

Post by VladSh »

Да, действительно хорошо.

А есть ли какой-то небольшой скриптец, в который бы это можно было параметрами передать, чтобы UI не поднимать?
Или где-то в конфиге настроить параметры замен и хотя бы в меню как-то вывести? Потому что с SearchReplace.js и SearchReplaceEx.js слишком много телодвижений в этом случае.

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

Post by LonerD »

VladSh wrote:А есть ли какой-то небольшой скриптец, в который бы это можно было параметрами передать, чтобы UI не поднимать?
У меня для всяких разных замен задействован скрипт Multi_SR.js.
К сожалению, здесь его нет - автор взялся модернизировать скрипт, разбил на два скрипта (по-моему, когда-то их пробовал, и не понравились), да так и пропал. Есть на форуме у Андрея с небольшими полезными доработками

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

Post by Skif_off »

LonerD wrote:Есть на форуме у Андрея с небольшими полезными доработками
Там нужна регистрация, лучше давать ссылку сюда.
Post Reply