Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] StringRegExpReplace: Конверт. строки атрибутов файла в формат Attrib.exe

Ответить
Настройки темы
[решено] StringRegExpReplace: Конверт. строки атрибутов файла в формат Attrib.exe

Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


Вступление:
И снова Регулярные выражения - я их обожаю (когда нахожу решение), и в то же время ненавижу (когда найти решение не удаётся, как сейчас например )...

Задача:

Имеем строку следующего вида (это аттрибуты файла для FileSetAttrib): "+RAT-SH"
Нужно её преобразовать в такой вид: " +R +A +T -S -H"

Т.е по сути нужно найти группу после знака модификации (+ или -), и в этой группе у каждого символа добавить пробел и найдены в начале модификатор.

Пробую так:

Код: Выделить весь код
$sStr = "+RAT-SH"

$sResult = StringRegExpReplace($sStr, "(\+|-)([RASHNOT]){2,}", "\1\2")

ConsoleWrite($sResult & @CRLF)
Но в результате остаются лишь последние символы в каждом наборе .

Цель задачи:
Позволить юзеру указывать привычный формат строки атрибутов файла (как в FileSetAttrib), но при этом использовать консольную утилиту Attrib, которая использует другой формат (каждый модификатор-атрибут отдельно).

P.S
Обходные методы и вопросы типа “а зачем использовать консольный Attrib.exe а не FileSetAttrib” не предлагать и не спрашивать, кроме прочего у меня есть спортивный интерес решения поставленной задачи.

Спасибо.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 01:03, 11-09-2009

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


прикольная задачка
самое "короткое" решение, которое придумал:
Код: Выделить весь код
$s = "-RASH+NOT"
$r = "[-+]?([^-+])(?<=([-+])[^-+]|([-+])[^-+]{2}|([-+])[^-+]{3}|([-+])[^-+]{4}|([-+])[^-+]{5}|([-+])[^-+]{6}|([-+])[^-+]{7})"
$x = StringRegExpReplace($s, $r, " \2\3\4\5\6\7\8\1")

ConsoleWrite($x &@CRLF)
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:17, 11-09-2009 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата amel27:
самое "короткое" решение, которое придумал »

Супер!
Скажи пожалуйста, мне просто интересно, сколько времени у тебя ушло на построение этого шаблона? Я более двух часов провозился чтобы у меня вышло... да собственно ничего

P.S
И всё же, что означает ^? И зчем знак вопроса в начале группы а потом ещё и треугольная скобка, и знак равно? Я подобное видел в шаблонах php, но так и не смог понять к чему оно, в манулах тоже смотрел, но толком ничего такого не находил...

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 06:50, 11-09-2009 | #3


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата Creat0R:
сколько времени у тебя ушло на построение этого шаблона? »
утром прочитал твой пост, пока ехал на работу в автобусе обдумал варианты, на тестирование/проверку - около часа... надо сказать, в прошлых версиях AutoIT позиционная проверка не работала - с тех пор я не проверял, а тут вдруг сработала в штатной справке её почему-то нет, но есть в справке к движку PCRE (Lookahead/Lookbehind assertions)

Отправлено: 07:23, 11-09-2009 | #4


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Цитата amel27:
пока ехал на работу в автобусе обдумал варианты »
В уме?

Цитата amel27:
на тестирование/проверку - около часа »
Ну всё ровно в два раза быстрее чем у меня ушло, а главное, в сотни раз эффективнее

Цитата amel27:
в штатной справке её почему-то нет, но есть в справке к движку PCRE (Lookahead/Lookbehind assertions) »
Нужно разработчикам написать, чтобы добавили.

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 15:52, 11-09-2009 | #5


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата Creat0R:
В уме? »
ок, если интересно - ход рассуждений примерно таков: RegExpReplace работает блоками, т.е. мы должны задействовать в замене ВСЮ строку без пропусков, тут вариантов всего два: 1) захват и обработка за ход всего блока "[+-][^+-]+", либо 2) работа посимвольно "[^+-]".

1-й подход - это "лобовой" перебор вариантов, причем с обязательной посимвольной детализацией содержимого блока (иначе как потом раскрывать в замене?), т.е придётся описать 7 комбинаций ~28 символьных позиций + метасимволы групп, сохранений и т.д. - перспектива удручающая...

2-й подход интересней, но тут одна проблема - как при обработке очередного символа восстановить результат из обработки прошлых символов?... поискать можно в двух направлениях: А) возможность "глобальных" (меж-атомарных) сохранений ($1 действительна только в пределах блока); или Б) попытаться использовать при обработке символы строки вне обрабатываемого блока.

Способ А есть в Perl и соответствует его обычным переменным, т.к. регулярные выражения - его смысловое ядро ("native inborn"), в библиотеке PCRE вроде есть именованные переменные, но описаны слабо и по ходу всё зависит от конечной сборки библиотеки... Короче, эксперименты ни к чему не привели - именованные переменные в AutoIT не работают (пока?).

Способ Б и есть та самая позиционная проверка (опережающая и ретроспективная), так хорошо описанная в книге Дж.Фридла – очень мощный приём, некоторые задачи без неё просто нерешаемы. Как уже сказал выше – в ранних реализациях RegExp они не поддерживались, тут представился повод еще раз проверить.

Цитата Creat0R:
Нужно разработчикам написать, чтобы добавили.»
да, теперь уже нужно
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:23, 12-09-2009 | #6


Аватара для Creat0R

Must AutoIt


Сообщения: 3054
Благодарности: 1009

Профиль | Сайт | Отправить PM | Цитировать


Последние сообщения отведены в новую тему Обсуждение FAQ'а (Ча.Во) по регулярным выражениям. А то уже начался сплошной

-------
“Сделай так просто, как возможно, но не проще этого.”... “Ты никогда не решишь проблему, если будешь думать так же, как те, кто её создал.”

Альберт Эйнштейн

P.S «Не оказываю техподдержку через ПМ/ICQ, и по email - для этого есть форум. ©»

http://creator-lab.ucoz.ru/Images/Icons/autoit_icon.png Русское сообщество AutoIt | http://creator-lab.ucoz.ru/Images/Ic...eator_icon.png CreatoR's Lab | http://creator-lab.ucoz.ru/Images/Icons/oac_icon.png Opera AC Community


Отправлено: 22:52, 14-09-2009 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] StringRegExpReplace: Конверт. строки атрибутов файла в формат Attrib.exe

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - attrib.exe требует вставить диск Device\Harddisc1\DR Мурена Microsoft Windows Vista 0 07-10-2009 12:16
[решено] Удаление строки из файла gregaz AutoIt 2 16-07-2009 18:46
[решено] Почему stringRegExpReplace удаляет из строки буквы? Twix1124 AutoIt 2 07-06-2009 22:28
Изменение атрибутов файла .doc Di373R Хочу все знать 8 31-05-2008 23:44
Ошибка - Установка атрибутов файла kolchoz Microsoft Windows 2000/XP 1 12-08-2007 08:52




 
Переход