#include <Array.au3>
;~ Dim $asArray[20] = ['NewA\B\A.jpg', 'New\A.jpg', 'Other\A.jpg','NewA\A.jpg', 'New\B\A.jpg', 'Other\B\B.jpg', 'Other\C.jpg', 'New1\C.jpg', 'Other\B\C.jpg', 'WOther\B.jpg', _
;~ 'Other\X\Z.jpg', 'New\B.jpg', 'New2\A\B\C\D\E.jpg', 'New2\A\E.jpg', 'New1\A.jpg', 'NewB\A.jpg', 'NewB\B.jpg', 'NewC\C.jpg', 'OtherA\B\C\D\E.jpg', 'OtherA\B\C\D\F.jpg']
;~ Dim $asArray[9] = ['A.JPG', 'IMG_6567.JPG', 'IMG_657.JPG', 'IMG_6572.JPG', 'B.JPG', 'Other\IMG_6694.JPG', 'Other\IMG_6693.JPG', 'Home\IMG_6523.JPG', 'Home\IMG_6515.JPG']
Dim $asArray[8] = ['ДруGoy-57.jpg', 'OtherЖЖ\A\B.jpg\', 'Othe5rh\B\A.jpg', 'Other-24\B.jpg', 'ДруGoy.jpg', 'Other-5\C.jpg', 'Other\D\G\Z\ю.jpg', 'Other\D\G\Z\J\K\U\R\H\N\B\A.jpg']
_ArraySortEx($asArray)
_ArrayDisplay($asArray)
Func _ArraySortEx(ByRef $asArray)
Local $asResNul, $iNum, $iNumDigits, $iSize = UBound($asArray) - 1
For $i = 0 To $iSize
$asRes = StringRegExp($asArray[$i], '^[^\\]+|(\\[^\\]+)', 3)
Switch UBound($asRes) ; Здесь выполняется поиск цифр (при наличии) в конце корневого названия
; Данное условие нуждается в проверке и доработке Патерна функции "StringRegExp".
Case 1
$asRes[0] = '!' & $asRes[0]
$asResNul = StringRegExp($asRes[0], '^(.+[^\d])(\d*)(\.[^.]+)$', 3) ; Это если в названии присутствует расширение
If @error Then ContinueCase
Case Else
$asResNul = StringRegExp($asRes[0], '^(.+[^\d])(\d*)($)', 3) ; Это если название без расширения
EndSwitch
If Not @error And $asResNul[1] Then ; Здесь производится маркировка найденных цифр в корневом названии
$iNum = StringLen($asResNul[1])
If $iNum > $iNumDigits Then $iNumDigits = $iNum
$asRes[0] = $asResNul[0] & '>' & $asResNul[1] & '>' & $asResNul[2]
EndIf
$asArray[$i] = $asRes[0] & '|' & StringFormat('%03s', UBound($asRes)) & '|' & $asArray[$i]
Next
For $i = 0 To $iSize ; Снова "разбираем" каждую строку массива "$asArray" по маркерам для заполнения нулями цифр в конце корневого названия
$asSplit = StringSplit($asArray[$i], '>')
If Not @error And $iNumDigits Then
$asSplit[2] = StringFormat('%0' & $iNumDigits & 's', $asSplit[2])
$asArray[$i] = $asSplit[1] & $asSplit[2] & $asSplit[3]
EndIf
Next
_ArraySort($asArray)
For $i = 0 To $iSize
$asArray[$i] = StringRegExpReplace($asArray[$i], '^.+\|', '')
Next
EndFunc ;==>_ArraySortEx