Автор Тема: Извлечение полного имени папки RegExp'ом, из нестандартного пути  (Прочитано 17141 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн f4llen [?]

  • Осваивающий
  • **
  • Сообщений: 160
  • Репутация: 40
  • Олл фо ЛулзЪ
    • Награды
К примеру есть пути:

C:\Program Files\Unknown\setup.exe /QWERTY
C:\Program Files\Nudoi\unipath.exe GUI
"C:\Program Files\SV Vision\jrarth.exe" /jellyroger /hide

нужно из такого вида путей извлечь нормальные, полноценные пути: к файлу, к папке.

у меня никак не получается
Leet Chat - программа для общения в локальной сети

Не оказываю тех. поддержку через форум - для этого есть ЛСД и Асекью

Русское сообщество AutoIt


Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
а без ключей пути есть?
Конференция посвященная AutoIt на jabber.ru - [email protected]
Как попасть на конференцию читаем тут


Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Я думаю вряд ли это можно решить только регулярными выражениями (хотя могу и ошибаться), особенно для первых двух случаев. Ведь файл может и не содержать расширения или параметром может служить другое имя файла... Для подобных целей я написал следующую функцию, но только здесь файл должен присутствовать по указанному пути, подозреваю, тебе это и нужно.

Код: AutoIt [Выделить]
ConsoleWrite(_ExtractPath('C:\Program Files\Unknown\setup.exe /QWERTY') & @CR)
ConsoleWrite(_ExtractPath('C:\Program Files\Nudoi\unipath.exe GUI') & @CR)
ConsoleWrite(_ExtractPath('"C:\Program Files\SV Vision\jrarth.exe" /jellyroger /hide') & @CR)

Func _ExtractPath($sPath)
    $sPath = StringStripWS($sPath, 7)
    If StringLeft($sPath, 1) = '"' Then
        $sPath = StringRegExpReplace($sPath, '\A"+|".*\z', '')
        If Not FileExists($sPath) Then
            $sPath = ''
        EndIf
    Else
        While Not FileExists($sPath)
            $sPath = StringLeft($sPath, StringInStr($sPath, ' ', 0, -1) - 1)
            If $sPath = '' Then
                ExitLoop
            EndIf
        WEnd
    EndIf
    Return $sPath
EndFunc   ;==>_ExtractPath

« Последнее редактирование: Март 10, 2010, 22:44:56 от Yashied »


Думай, прежде чем говорить.

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Код: AutoIt [Выделить]
$a = 'C:\Program Files\Unknown\setup.exe /QWERTY'
$b = 'C:\Program Files\Nudoi\unipath.exe GUI'
$c = '"C:\Program Files\SV Vision\jrarth.exe" /jellyroger /hide'
$d = '"C:\test.exe" /key1 /key2"'
$e = '"C:\Program Files\SV Vision\jrarth.exe"'
$pattern = '"?(\D\:(\\.+)+\w+\.\w+)"?.*'
MsgBox(0, '', StringRegExpReplace($a, $pattern, '\1'))
MsgBox(0, '', StringRegExpReplace($b, $pattern, '\1'))
MsgBox(0, '', StringRegExpReplace($c, $pattern, '\1'))
MsgBox(0, '', StringRegExpReplace($d, $pattern, '\1'))
MsgBox(0, '', StringRegExpReplace($e, $pattern, '\1'))
 


Русское сообщество AutoIt


Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Kaster, как я уже написал, а что если

C:\Program Files\Nudoi\unipath.exe test.exe

Оффлайн f4llen [?]

  • Осваивающий
  • **
  • Сообщений: 160

  • Автор темы
  • Репутация: 40
  • Олл фо ЛулзЪ
    • Награды
а без ключей пути есть?

Хммм..... Вроде есть, и их много. Что с ключами, что без.

Оффлайн Suppir [?]

  • Продвинутый
  • ***
  • Сообщений: 967
  • Репутация: 61
    • Награды
Вот регулярное выражение, которое ловит все случаи:
кроме случая, когда у файла нет расширения (тогда нужно писать пакет регулярных выражений для доскональной проверки)

""*(.+?\.\w+)


Проверочный код:

Код: AutoIt [Выделить]
$a = "C:\Program Files\Unknown\setup.exe /QWERTY"
$b = "C:\Program Files\Nudoi\unipath.exe GUI"
$c = """C:\Program Files\SV Vision\jrarth.exe"" /jellyroger /hide"

$aMatches = StringRegExp($a, """*(.+?\.\w+)", 1)
if @error = 0 Then MsgBox(0, "", $aMatches[0])
   
$aMatches = StringRegExp($b, """*(.+?\.\w+)", 1)
if @error = 0 Then MsgBox(0, "", $aMatches[0])

$aMatches = StringRegExp($c, """*(.+?\.\w+)", 1)
if @error = 0 Then MsgBox(0, "", $aMatches[0])
 


 :whistle:


Добавлено: Март 10, 2010, 17:23:33
Вариант "C:\Program Files\Nudoi\unipath.exe test.exe", предложенный Yashied'ом, также ловит.


Добавлено: Март 10, 2010, 17:29:02
А вот регулярка для отлова папок:

""*(.+)\\
« Последнее редактирование: Март 10, 2010, 17:29:02 от Suppir, Причина: Объединение сообщений »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Suppir, супер, только одно замечание, что если

C:\Program Files\UNKNOWN.DAT\setup.exe /QWERTY

Можешь поправить?

Русское сообщество AutoIt


Оффлайн Suppir [?]

  • Продвинутый
  • ***
  • Сообщений: 967
  • Репутация: 61
    • Награды
Это дополнительное условие. Нужно подумать :)


Добавлено: Март 10, 2010, 17:46:13
В таком случае предлагаю решать проблему в два прохода:

Код: AutoIt [Выделить]
$a = "C:\Program Files\UNKNOWN.DAT\setup.exe /QWERTY"

;~ сначала удаляем ключи (если есть)
$a = StringRegExpReplace($a, " /.+", "")

;~ затем ищем имя файла
$aMatches = StringRegExp($a, """*(.+\.\w+)", 1)

;~ результат
if @error = 0 Then MsgBox(0, "", $aMatches[0])

« Последнее редактирование: Март 10, 2010, 17:49:29 от Suppir »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
http://autoit-script.ru/index.php?topic=316.0


Добавлено: Март 10, 2010, 21:29:36
Suppir  [?]
Цитировать
В таком случае предлагаю решать проблему в два прохода
Не обязательно, в таком случае можно указать на конец строки:

Код: AutoIt [Выделить]
$1 = 'C:\Program Files\Unknown.dat\setup.exe /QWERTY'
$2 = '"C:\Program Files\SV Vision\jrarth.exe" GUI'
$3 = '"C:\Program Files\SV Vision\jrarth.exe" /jellyroger /hide'
$4 = '"C:\test.exe" /key1 /key2"'
$5 = 'C:\Program Files\Unknown.dat\setup.exe test.exe'

For $i = 1 To 5
    ;~ удаляем ключи (если есть)
    $Var = StringRegExpReplace(Eval($i), '(?i) (/.+|[а-яА-Я\w\d\._-]+)$|"', '')
   
    ;~ результат
    MsgBox(0, $i, $Var)
Next

« Последнее редактирование: Март 10, 2010, 21:56:11 от CreatoR, Причина: Объединение сообщений »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
CreatoR
Кавычки не удаляются.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
CreatoR,

C:\Program Files\Unknown.dat\setup.exe test.exe

Не работает.

:(

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Yashied  [?]
Цитировать
Не работает
Поправил, теперь в параметре также поддерживается дефис, символ подчёркивания, цифры, точки, и русские символы.


Добавлено: Март 10, 2010, 21:52:19
madmasles  [?]
Цитировать
Кавычки не удаляются
А должны?

Тоже подправил.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Вот небольшой сравнительный тест, это обычные строки, которые могут содержаться в реестре и как правило возвращаются функцией _WinAPI_AssocQueryString(). Пока мой способ впереди планеты всей (ну не люблю я регулярные выражения), но, как я уже сказал ранее, файл должен существовать на диске. Это конечно большой минус, но как правило пути извлекают для существующих файлов.

Код: AutoIt [Выделить]
Dim $aPath[8]

$aPath[0] = '"C:\Program Files\Unknown.dat\setup.exe" test.exe'
$aPath[1] = 'C:\Program Files\Unknown.dat\setup.exe test.exe'
$aPath[2] = 'C:\Program Files\Unknown.dat\setup.exe /d test.exe'
$aPath[3] = 'C:\Program Files\Unknown.dat\setup.exe test.exe /d'
$aPath[4] = 'C:\Program Files\Unknown.dat\setup.exe C:\#test.exe'
$aPath[5] = 'C:\Program Files\Unknown.dat\setup.exe #d C:\test.exe'
$aPath[6] = 'C:\Program Files\Unknown.dat\setup.exe test1.exe test2.exe'
$aPath[7] = 'C:\Program Files\Unknown.dat\setup.exe %1 -d -text.log'

For $i = 0 To UBound($aPath) - 1
    ; CreatoR
    ConsoleWrite('CreatoR: ' & StringRegExpReplace($aPath[$i], '(?i) (/.+|[а-яА-Я\w\d\._-]+)$|"', '') & @CR)

    ; Suppir
    $aMatches = StringRegExp(StringRegExpReplace($aPath[$i], ' /.+', ''), '"*(.+\.\w+)', 1)
    ConsoleWrite('Suppir:  ')
    If Not @error Then
        ConsoleWrite($aMatches[0])
    EndIf
    ConsoleWrite(@CR)

    ; Yashied
    ConsoleWrite('Yashied: ' & _ExtractPath($aPath[$i]) & @CR)
    ConsoleWrite('--------------------------------------------------' & @CR)
Next

Func _ExtractPath($sPath)
    $sPath = StringStripWS($sPath, 7)
    If StringLeft($sPath, 1) = '"' Then
        $sPath = StringRegExpReplace($sPath, '\A"+|".*\z', '')
        If Not FileExists($sPath) Then
            $sPath = ''
        EndIf
    Else
        While Not FileExists($sPath)
            $sPath = StringLeft($sPath, StringInStr($sPath, ' ', 0, -1) - 1)
            If $sPath = '' Then
                ExitLoop
            EndIf
        WEnd
    EndIf
    Return $sPath
EndFunc   ;==>_ExtractPath



CreatoR, Suppir,

Можно составить универсальный pattern для этих примеров?
« Последнее редактирование: Март 11, 2010, 01:08:44 от Yashied »

Русское сообщество AutoIt


 

Похожие темы

  Тема / Автор Ответов Последний ответ
3 Ответов
2929 Просмотров
Последний ответ Июль 09, 2010, 18:41:02
от aranea
7 Ответов
11325 Просмотров
Последний ответ Февраль 17, 2011, 19:23:02
от Yashied
7 Ответов
5837 Просмотров
Последний ответ Сентябрь 13, 2011, 19:40:50
от gregaz
1 Ответов
3112 Просмотров
Последний ответ Октябрь 21, 2011, 22:21:52
от Math
3 Ответов
2854 Просмотров
Последний ответ Декабрь 24, 2011, 16:53:07
от Garrett
3 Ответов
3333 Просмотров
Последний ответ Декабрь 23, 2011, 14:07:30
от AZJIO
0 Ответов
576 Просмотров
Последний ответ Сентябрь 01, 2015, 09:41:11
от madmasles
1 Ответов
767 Просмотров
Последний ответ Октябрь 14, 2015, 12:02:59
от InnI
2 Ответов
3993 Просмотров
Последний ответ Декабрь 24, 2015, 18:55:08
от Майор
4 Ответов
4842 Просмотров
Последний ответ Июль 21, 2016, 19:25:32
от Alofa