Что нового

Извлечение полного имени папки RegExp'ом, из нестандартного пути

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Yashied [?]
Нужно извлечь иконку (имя файла и индекс иконки). Возможны следующие варианты:

Может Так :

Код:
Dim $aPath[5]

$aPath[0] = 'C:\MyProgram\Icons.dll,1'
$aPath[1] = 'C:\MyProgram\Icons.dll  ,  1'
$aPath[2] = 'Icons.dll,  -4'
$aPath[3] = 'Icons.dll, <= В этом случае индекс 0'
$aPath[4] = 'Icons.dll <= Тоже 0'

;$sPattern = '((?:.*\\)?)(.*?\..*?dll)\D*(\d*)'

; $sPattern = '((?:.*\\)?)(.*?\..*?dll)\D*+(\d*+)' ; Может так будет лучше

$sPattern = '((?:.*\\)?.*?\..*?dll)\D*+(\d*+)' ; Так пожалуй корректней

For $i = 0 To UBound($aPath) - 1
    
   ;$sIcon=StringRegExpReplace($aPath[$i], $sPattern, '\2 | \3') 

    $sIcon=StringRegExpReplace($aPath[$i], $sPattern, '\1 | \2') ; Так пожалуй корректней
    
    ConsoleWrite($sIcon & @LF)
Next


P.S. Использован Патерн CreatoR'а.
 

amel27

Продвинутый
Сообщения
146
Репутация
55
Re: Извлечение полного имени папки RegExp\'ом, из нестандартного пути

Yashied сказал(а):
Нужно извлечь иконку (имя файла и индекс иконки).

Код:
Dim $a[5] = [ _
  'C:\My Program\Icons.dll,1'   , _
  'C:\My Program\Icons.dll  , 1', _
  '"C:\My Program,1\Icons.dll",  -4'              , _
  'Icons.dll,'                  , _
  'Icons.dll'                     _
]
For $i=0 To UBound($a)-1
  $f = StringRegExpReplace($a[$i], '^\s*(?>"([^"]*+)"|([^,]*?)\s*(?:,|$)).*+', "\1\2")
  $n = StringRegExpReplace($a[$i], ".*?(?>[\s,]([+-]?\d++)\s*|)$", "\1")+0
  
  ConsoleWrite("path: '"& $f &"'" &@CRLF)
  ConsoleWrite("icon: '"& $n &"'" &@CRLF)
  ConsoleWrite("----------------" &@CRLF)
Next
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: Извлечение полного имени папки RegExp\'ом, из нестандартного пути

amel27,
А если в исходном массиве есть ошибочная запись :
Код:
$a[6]='Icons.txt,'

или что то подобное ?



Добавлено:
Сообщение автоматически объединено:

С учетом изменений Получилось :
Код:
Dim $aPath[6]

$aPath[0] = 'C:\MyProgram\Icons.dll,1'
$aPath[1] = 'C:\MyProgram\Icons.dll  ,  1'
$aPath[2] = 'Icons.dll,  -4'
$aPath[3] = 'Icons.dll, <= В этом случае индекс 0'
$aPath[4] = 'Icons.dll <= Тоже 0'
$aPath[5] = 'Icons.txt <= Тоже 0' ; Ошибочная запись

$sPattern = '((?:.*\\)?.*?\..*?dll)\D*+(\d*+)' 

For $i = 0 To UBound($aPath) - 1
    
   $fIcon=StringRegExpReplace($aPath[$i], $sPattern, '\1') 
   $iIcon=StringRegExpReplace($aPath[$i], $sPattern, '\2') 
   $sIcon=StringRegExpReplace($aPath[$i], $sPattern, '\1 | \2') 
   If Not @extended Then ContinueLoop
   ConsoleWrite("$sPath : "& $fIcon & @LF)
   ConsoleWrite("$iIcon : "& $iIcon & @LF)
   ConsoleWrite("FullString : "& $sIcon & @LF)
   ConsoleWrite('============================' & @LF)
Next
 

amel27

Продвинутый
Сообщения
146
Репутация
55
Re: Извлечение полного имени папки RegExp\'ом, из нестандартного пути

gregaz сказал(а):
А если в исходном массиве есть ошибочная запись

Yashied 'у решать, фиксировать ошибки или нет... но иконки могут быть не только в DLL
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Re: Извлечение полного имени папки RegExp\'ом, из нестандартного пути

amel27 [?]
Yashied'у решать, фиксировать ошибки или нет... но иконки могут быть не только в DLL

Да , конечно

В принципе можно об"явить разрешенные расширения файлов :
Код:
$sPattern = '((?:.*\\)?.*?\..*?(dll|txt))\D*+(\d*+)' 

; ...............................................
    
   $fIcon=StringRegExpReplace($aPath[$i], $sPattern, '\1') 
   $iIcon=StringRegExpReplace($aPath[$i], $sPattern, '\3') 
   $sIcon=StringRegExpReplace($aPath[$i], $sPattern, '\1 | \3')


Похоже выявление иконок надо вынести в отдельную тему (эта тема - не совсем соответствует )
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Просто чудно!

:laugh:

Спасибо amel27 и gregaz. Конечно amel27 прав, расширение здесь не причем, теоретически оно может быть любым. Нам главное извлечь путь, а дальше пусть решает пользователь. Я вот все никак не могу (или просто времени нет) заставить себя изучить регулярные выражения. Конечно, я могу это реализовать с помощью String... функций, но, как представляется, с помощью регулярных выражений это будет более изящней, да и работать должно быстрее.
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Yashied [?]
Конечно, я могу это реализовать с помощью String... функций, но, как представляется, с помощью регулярных выражений это будет более изящней, да и работать должно быстрее.

Несомненно строковые преобразования надо делать с помощью регулярных выражений.
Использование String...[/i] функций в большинстве случаев - это мазохизм.Настолько несоизмеримы размер кода и скорость его выполнения
Проблема в том что :
1. Трудно выявить все варианты , где рег. выражение будет неправильно работать неизвестно кокга вылезет ошибка)
2. Трудно освоить рег. выражения настолько , чтобы быть увереным в 100% -ой правильности составленного выражения.

Хотя одно вытекает из другого
 
Автор
sforce5

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
Данная регулярка не извлекает пути формата "X:\XXX. XXX\FILE.EXT"

Код:
$aTxt = StringRegExpReplace("X:\XXX. XXX\FILE.EXT", '(?:"?)+(.*\\.*?\..*?)(?:"?)+ .*$', "\1")
MsgBox(64, "", $aTxt)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Автор
sforce5

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
Yashied сказал(а):
sforce5 сказал(а):
Данная регулярка не извлекает пути формата...

Таких путей в природе не бывает.

Для того чтобэ узнать существуют они или нетЪ, нужно тупо взять и создать папочку с именем xxx. xxx
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Ну да, это папка, я пропустил. Тогда ждем amel27.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Re: Извлечение полного имени папки RegExp\'ом, из нестандартного пути

sforce5 [?]
Данная регулярка не извлекает пути формата "X:\XXX. XXX\FILE.EXT"
А какой путь здесь нужно извлекать?


Добавлено:
Сообщение автоматически объединено:

А ну верно, там не предусмотрено отсутствие параметров на конце:

Код:
$aTxt = StringRegExpReplace("X:\XXX. XXX\FILE.EXT", '(?:"?)+(.*\\.*?\..*?)(?:"?)+( .*)?$', "\1")
MsgBox(64, "", $aTxt)
 

amel27

Продвинутый
Сообщения
146
Репутация
55
sforce5

как уже отметил выше CreatoR, перед составлением выражения нужно четко представлять все параметры (ограничения) входной строки, чтобы ОДНОЗНАЧНО находить путь в неоднозначных входных данных... к примеру, попробуйте определить, что есть "путь", что "файл", а что "параметры" в строке вида:
:smile:
Код:
X:\XXX. XXX\FILE.EXT XXX. XXX\FILE.EXT XXX. XXX\FILE.EXT XXX. XXX\FILE.EXT

возможные ограничения, которые можно использовать:

- путь с пробелами ВСЕГДА берется в кавычки (то же самое относится к параметрам);
- имя файла ВСЕГДА без пробелов;
- имя файла ВСЕГДА имеет определенно(ы)е расширения;
- файл существует на момент выполнения скрипта;
- ну и т.д.
 
Автор
sforce5

sforce5

Олл фо ЛулзЪ
Сообщения
160
Репутация
41
Здраствуйте опять все кто понимаетЪ RegExp!

Вот собсно есть путь:

"C:\SomeFolder\olololo.exe" "/U:C:\kakoy-to-bidlo-file.exe"

Вот то что выделенно, как можно "получить"?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
sforce5 [?]
Вот то что выделенно, как можно "получить"?
С кавычками:

Код:
$aTxt = StringRegExpReplace('"C:\SomeFolder\olololo.exe" "/U:C:\kakoy-to-bidlo-file.exe"', '("+?.*?\\[^"]+\.[^"]+"+?)( ?.+)?$', "\1")
MsgBox(64, "", $aTxt)


И без кавычек:

Код:
$aTxt = StringRegExpReplace('"C:\SomeFolder\olololo.exe" "/U:C:\kakoy-to-bidlo-file.exe"', '"+?(.*?\\[^"]+\.[^"]+)"+?( ?.+)?$', "\1")
MsgBox(64, "", $aTxt)
 

XM

Знающий
Сообщения
70
Репутация
8
'(^.*\..{3}) .*$'
Вот регулярка для всех случаев (НО! только если расширение из 3-х символов)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Vendor [?]
Вот регулярка для всех случаев
Оно далеко не для всех случаев, тот же пример из последнего поста от sforce5.
 

XM

Знающий
Сообщения
70
Репутация
8
Re: Извлечение полного имени папки RegExp\'ом, из нестандартного пути

Да. Что то я поспешил...


Добавлено:
Сообщение автоматически объединено:

тогда вот:
([^"]*\..{3}) *.*$

Отлавливает и случай:
пример из последнего поста от sforce5
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Vendor
Про универсальность уже писали выше:
[?]
перед составлением выражения нужно четко представлять все параметры (ограничения) входной строки, чтобы ОДНОЗНАЧНО находить путь в неоднозначных входных данных... к примеру, попробуйте определить, что есть "путь", что "файл", а что "параметры"
 
Верх