Что нового

Получение последней папки в пути с помощью рег. выражений

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Есть следующие возможные пути:

C:
C:\
C:\Dir1\Dir2
C:\Dir1\Dir2\
C:\Dir1\Dir2\MyFile
C:\Dir1\Dir2\MyFile.txt

и т.д.

Нужно получить соответственно последнюю папку, файл или диск за один вызов StringRegExpReplace(). Важно, в конце пути может быть "\". Должно получиться следующее:

C:
C:
Dir2
Dir2
MyFile
MyFile.txt

и т.д.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
CreatoR сказал(а):

Я знаю про это, но мне нужно просто шаблон, а не универсальная функция. Кроме того, я написал, что в конце пути может стоять "\" и шаблон не должен различать диски от папок или файлов. Сейчас я использую два вызова, а нужен один, в идеале просой и быстрый.

Код:
StringRegExpReplace(StringRegExpReplace($Path, '\\+\Z', ''), '^.*\\', '')
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Код:
$vTest = 'C:\Dir1\Dir2\MyFile'

$sRet = StringRegExpReplace($vTest, '(?:^.+?\\)?([^\\]+?)\\*$', '\1')

ConsoleWrite($sRet & @LF)
 
Автор
Yashied

Yashied

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

А можно попроще?

:whistle:
 

EqKeeper

Новичок
Сообщения
29
Репутация
1
Код:
$str = "C:\Dir1\Dir2\"
$str = StringRegExpReplace($str, "[\\]+\Z", "")
$str = StringSplit($str, "\\")
MsgBox(0, "", $str[UBound($str) - 1])

А вот и моя реализация универсальной делилки. :smile:
Код:
; Разделяет путь на диск, путь, имя файла и расширение
Func StringPathSplit($string)
	Dim $result[4] = [False, False, False, False]
	; Диск
	$exp = StringRegExp($string, "([A-Za-z]{1}:\\)", 1)
	If IsArray($exp) Then $result[0] = StringUpper($exp[0])
	; Путь
	$exp = StringRegExp($string, "[A-Za-z]{1}:\\(.*)\\[^\\]+$", 1)
	If IsArray($exp) Then $result[1] = $exp[0]
	; Имя файла
	$exp = StringRegExp($string, "\\([^\\\.]+)\.{0,1}[^\\\.]*$", 1)
	If IsArray($exp) Then $result[2] = $exp[0]
	; Расширение
	$exp = StringRegExp($string, "\\[^\\\.]+\.([^\\\.]+)$", 1)
	If IsArray($exp) Then $result[3] = StringLower($exp[0])
	; Возвращаем
	Return $result
EndFunc

Добавлено:
CreatoR, как обычно, крут. :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
У меня чуть длиннее вариант ;D
Код:
$sStr = "C:" & _
		"C:\" & _
		"C:\Dir1\Dir2" & _
		"C:\Dir1\Dir2\" & _
		"C:\Dir1\Dir2\MyFile" & _
		"C:\Dir1\Dir2\MyFile.txt"

ConsoleWrite(StringRegExpReplace($sStr, ".*?((?:[a-zA-Z0-9][a-zA-Z\.\d_]+)\.(?:[a-zA-Z\d]{3}))(?![\w\.])", "\1"))


Добавлено: 20:20

Мммда, я не правильно понял поставленную задачу :(
Извиняюсь!
 

kzru_hunter

Осваивающий
Сообщения
144
Репутация
49
Код:
$vTest = 'C:\Dir1\Dir2\MyFile'

$sRet = StringRegExpReplace($vTest , "(?:.+\\)?(.+?)\\?", "$1")

ConsoleWrite($sRet & @LF)
 
Автор
Yashied

Yashied

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

:beer:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Yashied [?]
Этот вариант (последний) не сработает если на конце более одного слеша.

Вот так будет корректнее:
Код:
$vTest = 'C:\Dir1\Dir2\MyFile'

$sRet = StringRegExpReplace($vTest, '(?:.+\\)?([^\\]+?)\\*', '\1')
ConsoleWrite($sRet & @LF)
 
Верх