Page 14 of 28

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

Posted: Sat Jan 25, 2014 10:51 am
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

Posted: Mon Feb 03, 2014 9:44 pm
by Drugmix
EDIT: я во всём разобрался, группы с условиями ничего не поломали.

Posted: Mon Feb 03, 2014 10:36 pm
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)"

Posted: Mon Feb 03, 2014 11:31 pm
by Drugmix
opk44, это лишь пример из хэлп-файла акелпада.

Posted: Mon Feb 03, 2014 11:32 pm
by Drugmix
opk44
наверно, уместней продолжить обсуждение в другой теме, я туда ответ написал.

Posted: Wed Feb 05, 2014 11:22 pm
by Drugmix
Я тут закончил писать правила для QuotesRE: для подсветки синтаксиса AutoHotkey и пришло время оптимизаций.

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

Code: Select all

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

Posted: Thu Feb 06, 2014 6:11 am
by YuS
Drugmix wrote:Cкажите, что быстрее:

Code: Select all

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

Code: Select all

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

Posted: Thu Feb 06, 2014 8:08 am
by Serge Yolkin
YuS wrote:... (?> ...
?

Posted: Fri Feb 07, 2014 2:49 pm
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]

Posted: Fri Feb 07, 2014 7:53 pm
by Serge Yolkin
Drugmix
Ага. Это не только в регулярках. Общее правило: если один шаблон является огрызком (в конце, начало такое же) другого, самый короткий пишем в конце, чтобы сперва проверялись длинные совпадения.

Posted: Sat Feb 08, 2014 8:16 am
by YuS
Serge Yolkin wrote:
YuS wrote:... (?> ...
?
А, ну да, в AP это не описано и скорее всего, не работает...

Posted: Sat Feb 08, 2014 12:40 pm
by Drugmix
YuS
теперь работает, просто оно лишнее там.

Posted: Sat Feb 08, 2014 5:55 pm
by Serge Yolkin
Набираю в диалоге поиска (с регулярными выражениями)
content(?>editable)
получаю сообщение "Синтаксическая ошибка"
?

Posted: Sat Feb 08, 2014 6:32 pm
by Drugmix
Serge Yolkin
и правильно. Синтаксис-то иначе задан:

Code: Select all

content(?=editable)