Регулярные выражения — ликбез по регэкспам

Здесь обсуждаются темы, косвенно связанные с Far.
Demiurg
Posts: 22
Joined: Wed 05 May, 2010 07:39
Location: Химки
Contact:

Re: Помогите с регулярным выражением.

Post by Demiurg » Mon 05 Jul, 2010 13:42

Latest post of the previous page:

Perl

Code: Select all

my @a = ( '1.0 alpha 1', '2.0.0rc2', '1.0.0a', '1.0.0.5' );

for( @a ) {
    my @b = split /\W|(?<=\d)(?=\D)/;
    print join(', ', @b) . "\n";
}
Результат:

Code: Select all

1, 0, alpha, 1
2, 0, 0, rc2
1, 0, 0, a
1, 0, 0, 5

User avatar
WARP ItSelf
Самый умный
Posts: 1011
Joined: Tue 15 Mar, 2005 23:19
Contact:

Re: Помогите с регулярным выражением.

Post by WARP ItSelf » Fri 24 Jun, 2011 05:46

Еще вопрос возник на ту же тему. Чуть более хитрый.

Нужно регулярное выражение, рекурсивное, которое будет доставать все подстроки, начинающиеся с подстроки А и заканчивающиеся на подстроку Б.

Т.е для строки: {{this is a test {{nested}} string}} хочется получить

1. this is a test {{nested}} string
2. nested

Строки А и Б, соответственно это {{ и }}
Никто не знал, а я...

User avatar
HaRT
Moderator
Posts: 8048
Joined: Tue 30 Aug, 2005 17:21
Location: Санкт-Петербург
Has thanked: 67 times
Been thanked: 100 times

Re: Помогите с регулярным выражением.

Post by HaRT » Fri 24 Jun, 2011 11:24

В данном контексте понятия “регулярный” и “рекурсивный” почти взаимоисключающие. “Почти” — потому, что регулярный язык в принципе может иметь рекурсию, но только не более наперёд заданной глубины. Насколько я знаю, регулярными выражениями рекурсия не описывается. Впрочем, пойду-ка посмотрю недавние добавления в PCRE…
Фар есть инструмент, а не нянька. © 2009 DrKnS

User avatar
Centaur
Posts: 1083
Joined: Tue 05 Apr, 2005 20:09
Location: Novosibirsk, Russia

Re: Помогите с регулярным выражением.

Post by Centaur » Fri 24 Jun, 2011 15:48

+1 к теоретической невозможности распарсить контекстно-свободную грамматику регулярным выражением. Единственное расширение регулярных выражений — это бэкреференсы, а они тут не помогут.

Kildor
Posts: 1515
Joined: Wed 16 Mar, 2005 06:26
Location: Новосибирск
Contact:

Не получается сделать регэксп с «*»

Post by Kildor » Thu 12 Apr, 2012 05:38

f2065 wrote: А где вообще почитать какой-нибудь хороший FAQ или мануал по встроенным регэкспам FAR ?
Во встроенной F1-справке как-то это все неочевидно…
В фаре используется +/- PCRE диалект регулярок. За исключением отсутствия поддержки многострочности (ограничение собственно редактора), и части новых вещей стандарта. Поэтому всё просто.

PS: По поводу многострочного поиска — можно обойти это ограничение путём поиска-замены из панелей, например плагином S&R (ReSearch тоже же это умеет?).
Ты мне не выкай!
«ФарФорум не для пользователей!»
Upd:
P.S. Я просто поддерживаю беседу.» © Народ.

xmpp:kildor@jabber.ru

2useven10
Posts: 2983
Joined: Mon 07 Sep, 2009 10:40
Has thanked: 2 times
Been thanked: 80 times

Re: Не получается сделать регэксп с «*»

Post by 2useven10 » Thu 12 Apr, 2012 05:54


ladserg
Posts: 214
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 1 time
Been thanked: 1 time

Применение регулярных выражений

Post by ladserg » Fri 19 Sep, 2014 21:41

Чот не могу понять, то ли я неправильный шаблон поиска задаю, то ли еще что. Есть файл со строками вида:
Ищу все строки в которых нет DLL файлов, шаблон "(^.*)(?!dll$)$" выделяет все строки, зато шаблон "(^.*)(?:dll$)$" как раз выделяет только строки с DLL файлами, кои мне надо пропустить. Никто не подскажет, чего я делаю не так?

Проверялось на всех трёх библиотеках.

Shmuel
Posts: 5164
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 145 times

Re: LuaFAR Search

Post by Shmuel » Fri 19 Sep, 2014 22:08

ladserg wrote:Чот не могу понять, то ли я неправильный шаблон поиска задаю, то ли еще что. Есть файл со строками вида:
Ищу все строки в которых нет DLL файлов, шаблон "(^.*)(?!dll$)$" выделяет все строки, зато шаблон "(^.*)(?:dll$)$" как раз выделяет только строки с DLL файлами, кои мне надо пропустить. Никто не подскажет, чего я делаю не так?

Проверялось на всех трёх библиотеках.
Вот так работает: .*?(?!\.dll$).{4}$|^.{1,3}$

ladserg
Posts: 214
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 1 time
Been thanked: 1 time

Re: LuaFAR Search

Post by ladserg » Fri 19 Sep, 2014 22:12

Shmuel wrote:Вот так работает: .*?(?!\.dll$).{4}$|^.{1,3}$
Спасибо, скажите мой вариант был ошибочен?

Shmuel
Posts: 5164
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 145 times

Re: LuaFAR Search

Post by Shmuel » Fri 19 Sep, 2014 22:17

Ваши варианты дали результаты, соответствующие им, то-есть плагин выдал то, что ему сказали выдать.

ladserg
Posts: 214
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 1 time
Been thanked: 1 time

Re: LuaFAR Search

Post by ladserg » Fri 19 Sep, 2014 22:20

Всё кажется разобрался, я правильно понял что паттерн вида (?!pattern) выступает как один символ и надо указывать его размер?

Вот так: ^.*(?!\.dll$).{4}$ тоже работает, а для чего дополнение |^.{1,3}?
Shmuel wrote:Ваши варианты дали результаты, соответствующие им, то-есть плагин выдал то, что ему сказали выдать.
Видимо я пока еще не совсем понял эту часть регэкспов :-/

Shmuel
Posts: 5164
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 145 times

Re: LuaFAR Search

Post by Shmuel » Fri 19 Sep, 2014 22:22

ladserg wrote:Всё кажется разобрался, я правильно понял что паттерн вида (?!pattern) выступает как один символ и надо указывать его размер?

Вот так: ^.*(?!\.dll$).{4}$ тоже работает, а для чего дополнение |^.{1,3}?
1. Неправильно.
2. Для имён короче 4 символов.

ladserg
Posts: 214
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 1 time
Been thanked: 1 time

Re: LuaFAR Search

Post by ladserg » Fri 19 Sep, 2014 22:29

Shmuel wrote:1. Неправильно.
Хм, понял, пойду курить маны.
Shmuel wrote:2. Для имён короче 4 символов.
Странно, без него все равно работает как надо :-/

Спасибо.

Shmuel
Posts: 5164
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 145 times

Re: LuaFAR Search

Post by Shmuel » Fri 19 Sep, 2014 22:31

ladserg wrote:
Shmuel wrote:2. Для имён короче 4 символов.
Странно, без него все равно работает как надо :-/
Попробуйте добавить в файл строчку abc - она не будет выведена без |^.{1,3}$ в паттерне.

ladserg
Posts: 214
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 1 time
Been thanked: 1 time

Re: LuaFAR Search

Post by ladserg » Fri 19 Sep, 2014 22:39

Shmuel wrote:Попробуйте добавить в файл строчку abc - она не будет выведена без |^.{1,3}$ в паттерне.
Понял, спасибо.

ladserg
Posts: 214
Joined: Thu 19 Feb, 2009 14:51
Has thanked: 1 time
Been thanked: 1 time

Re: LuaFAR Search

Post by ladserg » Fri 19 Sep, 2014 22:54

Shmuel wrote:Попробуйте добавить в файл строчку abc - она не будет выведена без |^.{1,3}$ в паттерне.
Кажется я разобрался в чем была моя ошибка. Предлагаю чуток изменить справку по поводу вот таких конструкций на текст вида:
(?= шаблон) - после этой точки есть фрагмент текста, который соответствует указанному регулярному выражению,
(?! шаблон) - после этой точки нет текста, который бы соответствовал указанному регулярному выражению,
(?<= шаблон) - перед этой точкой есть фрагмент текста, соответствующий указанному регулярному выражению,
(?<! шаблон) - перед этой точкой нет фрагмента текста, соответствующего указанному регулярному выражению.
Он, признаться, понятнее чем нынешний текст.

Теперь получается паттерн можно упростить: ^(?!.*\.dll$).*$ , вроде работает, если я правильно понял приведенную мною цитату :-/ .

Shmuel
Posts: 5164
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 15 times
Been thanked: 145 times

Re: LuaFAR Search

Post by Shmuel » Fri 19 Sep, 2014 23:22

^(?!.*\.dll$).+$ - чтобы не выдавал пустые строки.

Post Reply

Return to “Операционные системы, командные оболочки и прочее”