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

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

Post by Serge Yolkin »


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

Post by YuS »

Skif_off wrote: Тогда не захватится \xxx@x
Вы сформулируйте полностью задачу, тогда и решать её будем, а так... вопрос был по другому поводу, на него и был дан ответ.)
Serge Yolkin wrote:Не удержался :)
А попадалось ли Вам выражение для разбора е-майлов?
Примерно такое :)
Last edited by YuS on Tue Dec 03, 2013 4:45 pm, edited 1 time in total.

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

Post by Skif_off »

YuS wrote:Вы сформулируйте полностью задачу, тогда и решать её будем, а так... вопрос был по другому поводу, на него и был дан ответ.)
Просто решил написать, почему не подходят предложенные варианты, а не обойтись только благодарностью за пояснения :)

Добавлено:
В параллельной теме Xephon предложил такое

Code: Select all

\\(?=[a-z@]{3,})[a-z]*@[a-z]*
выражение, кажется, это можно считать вариантом решения.

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

Post by YuS »

Skif_off wrote: В параллельной теме Xephon предложил такое

Code: Select all

\\(?=[a-z@]{3,})[a-z]*@[a-z]*
выражение, кажется, это можно считать вариантом решения.
Говорю же, необходимо полное условие, т.е. ссылку туда сразу надо было дать.)
Если я правильно понял, то из следующих строк:
\@
\@x
\x@x
\@x
\x@
Необходимо найти минимальное сочетание обязательных символов и хотя бы одной буквы. Символы "" и "@" - обязательны, а остальные могут отсутствовать. Так? Если да, то:
Наверное, без поиска по условию тут не обойтись:

Code: Select all

\\[a-z]*@(?(?<=[a-z]@)[a-z]*$|[a-z]+$)
Расшифровка
Возможно, что регулярные джедаи смогут и без него обойтись, но я не из таких, увы. :)

ЗЫ К сожалению, в Акелпадовских регулярках это пока не реализовано...
Добавлено:
ЗЗЫ Кстати, да, предложенный вариант джедаем Xephon, как раз таки работает, правда только вот в таком виде:

Code: Select all

\\(?=[a-z@]{2,})[a-z]*@[a-z]*

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

Post by Skif_off »

YuS wrote:Говорю же, необходимо полное условие, т.е. ссылку туда сразу надо было дать.)
Думал, есть что-то универсальное, для любого регулярного выражения, а пример на обе темы для простоты восприятия (своего) :)

Offline
Posts: 582
Joined: Mon Apr 08, 2013 9:50 pm
Location: Win7SP1x64, APx64

Post by Drugmix »

Помогите улучшить правило для coder.coder:

Code: Select all

0	"^\s*(\d+)\s*`(.*)`\s*`\s*\\(\d*)=\((.*),(.*),(.*)\)\s*`\s*$"  "\1=(0,#ff0000,0) \2=(0,#00ff00,0) \3=(2,#0000ff,0) \4=(0,#ff0000,0) \5=(0,#00ff00,0) \6=(2,#0000ff,0)"
это правило в принципе работает:
Image
но если в правиле (для которого пишется это правило) BackRef'ов больше одного, то окрашивается не так, как хотелось бы:
Image
я понимаю почему так происходит (потому что шаблон составлен именно так, lol), но не понимаю как это исправить.
По идее, должно бы работать что-то вроде

Code: Select all

0	"^\s*(\d+)\s*`(.*)`\s*`(\s*\\(\d*)=\((.*),(.*),(.*)\)\s*)*`\s*$"  "\1=(0,#ff0000,0) \2=(0,#00ff00,0) \4=(2,#0000ff,0) \5=(0,#ff0000,0) \6=(0,#00ff00,0) \7=(2,#0000ff,0)"
или

Code: Select all

0	"^\s*(\d+)\s*`(.*)`\s*`(?:\s*\\(\d*)=\((.*),(.*),(.*)\)\s*)*`\s*$"  "\1=(0,#ff0000,0) \2=(0,#00ff00,0) \3=(2,#0000ff,0) \4=(0,#ff0000,0) \5=(0,#00ff00,0) \6=(2,#0000ff,0)"
но одна из групп (.*) становится овержадной, а если им всем трём добавить по ? в конец - то правило перестаёт работать совсем.

Offline
Posts: 269
Joined: Mon Jun 20, 2011 8:33 am
Location: Электросталь

Post by yozhic »

В тексте
abc dbe fbg axc dxe fxg
нужно найти все совпадения «b» и «x» между любыми буквами, кроме «a» и «c», и заключить их в фигурные скобки.
Выражение
Найти: (?<!a)(b|x)(?!c)
Заменить: {\1}
совпадения находит, но ничего не меняет. В синтаксисе ошибка, или может в программе «жучок»? AkelPad 4.8.6.

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

Post by Instructor »

yozhic
Для конструкций (?<!) и (?<=) используйте "Заменить все" (пояснение).

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

Post by Serge Yolkin »

Господа, а не подскажет ли кто, как записать "НЕ_обратная_ссылка"?
Выражение вида

Code: Select all

(['"]).*\1\s*$
в целом работает, но не всегда так, как хотелось бы. А как, вместо ".*", написать"всё, что угодно, кроме \1"?

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

Post by YuS »

Serge Yolkin wrote:А как, вместо ".*", написать"всё, что угодно, кроме \1"?
Вот так.

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

Post by Instructor »

YuS
Не подойдет при вложенности: "1'x'3"

Serge Yolkin
В тестовой версии можно так:

Code: Select all

(['"])[^\1]*

Code: Select all

(['"])(?^\1)*

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

Post by Serge Yolkin »

YuS
Спасибо, но не то: нужна именно обратная ссылка, т.е., если отловлена одинарная кавычка, то двойная допускается, всё, кроме одинарной, и наоборот.

Instructor
В не тестовой вот такая конструкция работает:

Code: Select all

`\s(['"\u0060]?)(((?!\1).)+)(\1)\s*$` `\1=... \2=... \4=...`
А с тестовой ещё поиграюсь.

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

Post by YuS »

Instructor wrote:YuS
Не подойдет при вложенности: "1'x'3"
Это да... поэтому сначала так и написал:

Code: Select all

(['"])[^\1]*\1
но, проверив и убедившись, что в AP это пока нереализовано, то исправил на то, что работало в релизе...
Про тестовую версию теперь знаю, что там уже работает.

Кстати, на regex101.com в конструкции [^\1], обратная ссылка почему-то интерпретируется как символ с восьмеричным индексом... ещё и это вызвало сомнение, в том, что это, возможно, неправильная запись регулярки. Ведь в наборах символов, сами метасимволы и обратные ссылки могут интерпретироваться совсем по-другому...

Offline
Posts: 366
Joined: Mon Jan 10, 2011 5:28 pm
Contact:

Post by Lenchik »

YuS wrote:на regex101.com
Какие настройки на этом сайте надо вбивать справа (и/или сверху) от строки выражения, чтобы было почти эквивалентно акельпадным регулярным выражениям:
а) в coder файлах;
б) в строках поиска и searchandreplace.js?

Offline
Posts: 582
Joined: Mon Apr 08, 2013 9:50 pm
Location: Win7SP1x64, APx64

Post by Drugmix »

Lenchik
PCRE (PHP), gm (+ возможно U, а возможно не поможет).
И я не уверен, что новомодные Character classes с того сайта (типа [[:alpha:]]) поддерживаются в AkelPad (в документации про них не сказано, а проверять - не проверял).
Post Reply