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

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

Post by Skif_off »

YuS wrote:Ну, это уже не вопрос функционала поиска по условию, а в правильном составлении регэкспа
Согласен, только я в этом плохо разбираюсь, поэтому обратил ваше внимание :)
1 - пример корректной работы правила, 2-3 - нет.

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

Post by YuS »

Skif_off wrote: Согласен, только я в этом плохо разбираюсь, поэтому обратил ваше внимание :)
1 - пример корректной работы правила, 2-3 - нет.
Ок, понятно. Если вдруг, кому-нибудь нужно:
Вот такое правило:

Code: Select all

^(?([^\n]{15,})([^.\n]{1,8})[^\n]*?(?([^.\n]+$)[^\n]+|(\.[^.\n]{0,4}))[^.\n]*?$)
Замена: \1..\2
будет обрезать имя и расширение файла при последовательных условиях:
1. Сумма символов имени и расширения - 15 и более
2. Имя файла будет обрезано до первой точки в имени, при условии наличия точки до восьмого символа имени, или если имя длиннее 8 символов и без точки, то оно будет обрезано до 8 символов.
3. Расширение файла будет обрезано, если оно длиннее 4 символов, причем обрезанная часть расширения точками замещаться не будет



Исходный текст:

Code: Select all

12345678.abc
abc.12345678
123456789012
1234567890123
abc.123456789
abc.1234567890
12345678901234

abc.12345678901
abc.123456789012
abc.1234567890123
abc.12345678901234567890
abc.1234567890.1234567890
2.123456789012345678901.ab 
3.1234567890123456789012.ab 
4.12345678901234567890123.ab 
5.123456789012345678901234.ab 
6.1234567890123456789012345.ab 
7.12345678901234567890123456.ab 
8.123456789012345678901234567890.ab 
9.123456789012345678901234567890.1234567890123456.7890.ab 
0.123456789012345678901234567890.12345678901.234567890....abcdef012345 
  12345678901234567890123456789012345678901234567890
12345678901.abc
12345678901.abc
123456789012.abc
1234567890123.abc
12345678901234.abc
123456789012.abcdefgh
1234567890123.abcdefgh
12345678901234.abcdefgh
Результат:

Code: Select all

12345678.abc
abc.12345678
123456789012
1234567890123
abc.123456789
abc.1234567890
12345678901234

abc...1234
abc...1234
abc...1234
abc...1234
abc...1234
2...ab 
3...ab 
4...ab 
5...ab 
6...ab 
7...ab 
8...ab 
9...ab 
0...abcd
  123456..
12345678...abc
12345678...abc
12345678...abc
12345678...abc
12345678...abc
12345678...abcd
12345678...abcd
12345678...abcd

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

Post by Drugmix »

EDIT: я во всём разобрался, группы с условиями ничего не поломали.
Last edited by Drugmix on Tue Feb 04, 2014 2:24 am, edited 1 time in total.

Offline
Posts: 874
Joined: Sat Jan 16, 2010 2:03 pm

Post by opk44 »

Drugmix
светить нужно только слово "Windows"?
1. Можно лепить проверку на конец строки каждому проверяемому варианту:

Code: Select all

0	"^(Windows\s+(?=95$|98$|NT$|2000$))"	"\1=(4,${IF},0)"
2. Но почему бы просто не сохранить шаблон?

Code: Select all

0	"^(Windows\s+)(95|98|NT|2000)$"	"\1=(4,${IF},0)"

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

Post by Drugmix »

opk44, это лишь пример из хэлп-файла акелпада.

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

Post by Drugmix »

opk44
наверно, уместней продолжить обсуждение в другой теме, я туда ответ написал.

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

Post by Drugmix »

Я тут закончил писать правила для QuotesRE: для подсветки синтаксиса AutoHotkey и пришло время оптимизаций.

Cкажите, что быстрее:

Code: Select all

(IfWinActive|IfWinNotActive|IfWinExist|IfWinNotExist)
или
(IfWin(?:Not)(?:Active|Exist))
?

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

Post by YuS »

Drugmix wrote:Cкажите, что быстрее:

Code: Select all

(IfWinActive|IfWinNotActive|IfWinExist|IfWinNotExist)
или
(IfWin(?:Not)(?:Active|Exist))
?

Code: Select all

IfWin(?:Not)?(?>Active|Exist)

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

Post by Serge Yolkin »

YuS wrote:... (?> ...
?

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

Post by Drugmix »

Гм, занимательно:

Code: Select all

"^\s*(?:\}\s*)*?(?:(Else)(?:\s*,\s*|\s+|\s*\{\s*)|(.+(?=::))::)?(?:(Try)(?:\s*,\s*|\s+|\s*\{\s*))?\s*(DriveGet)(?:\s*,\s*|\s+)(([^;,\s]|(?<=`),|(?<!\s);|\s(?!\s*?(?:;|$)))+?)(?:\s*,\s*)(List|Cap|Capacity|FS|FileSystem|Label|Serial|Type|Status|StatusCD)(?:\s*,\s*(([^;,\s]|(?<=`),|(?<!\s);|\s(?!\s*?(?:;)))*?)?)?\s*?((?<=\s);.*)?$" "\1=(4,${IF},0) \2=(4,${STR},0) \3=(2,${OP},0) \4=(0,${OP},0) \6=(0,${VAR},0) \7=(0,${TYPE},0) \9=(0,${TYPE},0) \10=(3,${COMM},0)"
Не срабатывает на

Code: Select all

DriveGet, OutputVar, StatusCD, Value
DriveGet, OutputVar, Capacity, Value
А

Code: Select all

"^\s*(?:\}\s*)*?(?:(Else)(?:\s*,\s*|\s+|\s*\{\s*)|(.+(?=::))::)?(?:(Try)(?:\s*,\s*|\s+|\s*\{\s*))?\s*(DriveGet)(?:\s*,\s*|\s+)(([^;,\s]|(?<=`),|(?<!\s);|\s(?!\s*?(?:;|$)))+?)(?:\s*,\s*)(List|Capacity|Cap|FS|FileSystem|Label|Serial|Type|StatusCD|Status)(?:\s*,\s*(([^;,\s]|(?<=`),|(?<!\s);|\s(?!\s*?(?:;)))*?)?)?\s*?((?<=\s);.*)?$" "\1=(4,${IF},0) \2=(4,${STR},0) \3=(2,${OP},0) \4=(0,${OP},0) \6=(0,${VAR},0) \7=(0,${TYPE},0) \9=(0,${TYPE},0) \10=(3,${COMM},0)"
срабатывает ок. Разница лишь в последовательности аргументов оператора ИЛИ.[/code]

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

Post by Serge Yolkin »

Drugmix
Ага. Это не только в регулярках. Общее правило: если один шаблон является огрызком (в конце, начало такое же) другого, самый короткий пишем в конце, чтобы сперва проверялись длинные совпадения.

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

Post by YuS »

Serge Yolkin wrote:
YuS wrote:... (?> ...
?
А, ну да, в AP это не описано и скорее всего, не работает...

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

Post by Drugmix »

YuS
теперь работает, просто оно лишнее там.

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

Post by Serge Yolkin »

Набираю в диалоге поиска (с регулярными выражениями)
content(?>editable)
получаю сообщение "Синтаксическая ошибка"
?

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

Post by Drugmix »

Serge Yolkin
и правильно. Синтаксис-то иначе задан:

Code: Select all

content(?=editable)
Post Reply