Что нового

Не срабатывает StringRegExpReplace при обработке массива когда отсекает путь со слэшами

DyadyaGenya

Знающий
Сообщения
300
Репутация
10
Доброго времени суток. Почему-то не срабатывает функция StringRegExpReplace. Сперва обрабатываю один массив, значения ячеек которого равны путь+дата+маска имени. В нем все отсекает, что нужно. Затем полученный массив обрабатывает повторно и уже не получается отсечь лишнее, тоесть путь. Даже если сперва попробовать отсечь путь, а потом уже конечный шаблон.

Код:
#include <Date.au3>
#include <Array.au3>
#include <File.au3>

Global $MaskName = " маска шаблона"
Global $sPath = @DesktopDir & '\'
Global $aReturn[0]
_ArrayAdd($aReturn, $sPath & '01.12.2021' & $MaskName)
_ArrayAdd($aReturn, $sPath & '04.12.2021' & $MaskName)
_ArrayAdd($aReturn, $sPath & '05.12.2021' & $MaskName)
_ArrayAdd($aReturn, $sPath & '23.11.2021' & $MaskName)
_ArrayAdd($aReturn, $sPath & '28.11.2021' & $MaskName)
_ArrayAdd($aReturn, $sPath & '29.11.2021' & $MaskName)

_ArrayDisplay($aReturn, "Полученный массив")

 ; отсекаем все кроме даты, чтобы отсортировать по наиболее свежей дате
; Тут срабатывает StringRegExpReplace
 Local $rowDataPath[0], $rowData[0]
 For $i = 0 To UBound($aReturn)-1
_ArrayAdd($rowDataPath, StringRegExpReplace($aReturn[$i], $MaskName, "")) ; если тут заменить $MaskName на $sPath то не сработает
 ConsoleWrite($rowDataPath[$i] & @CR)
 Next

_ArrayDisplay($rowDataPath, "Оставшиеся Путь и дата")

ConsoleWrite($sPath & @CR)

ConsoleWrite("размер массива путей и дат = " & UBound($rowDataPath) & @CR)

; тут уже не срабатывает StringRegExpReplace
; отсекаем путь, оставляем дату
 For $j = 0 To UBound($rowDataPath)-1
   _ArrayAdd($rowData, StringRegExpReplace($rowDataPath[$j], $sPath, "")) ; если тут заменить $sPath на $MaskName то сработает
   ConsoleWrite($rowData[$j] & @CR)
Next
 _ArrayDisplay($rowData, "после отсечения пути")

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

Частично проблему понял. Не срабатывает обратный слэш. Если в пути слэши "перекрыть" слэшем, вот так:
Код:
C:\\Users\\user\\Desktop\\

то все работает. Но я получаю путь в переменную уже со слэшами. И путь может меняться. Как быть?
Сообщение автоматически объединено:

В принципе решил, не знаю насколько правильно, но сделал замену:
Код:
$doubleSlashes = StringReplace($sPath,"\","\\")
и потом
_ArrayAdd($rowData, StringRegExpReplace($rowDataPath[$j], $doubleSlashes, ""))
 
Последнее редактирование:

Oki

Продвинутый
Сообщения
452
Репутация
62
Код:
StringRegExpReplace($aReturn[$i], $MaskName, "")
Эта функция не годится для такой задачи, поскольку шаблон это не то же самое, что последовательность символов. В первом случае случайно получилось из-за простоты "шаблона", который и тогда был совершенно не нужен, а в ином случае не получился бы даже этот первый шаг (это зависит от того, какие элементы шаблона будут восприняты в качестве специальных элементов регулярного выражения).

Для решения подобных задач существуют более простые функции без использования регулярных выражений. В данной ситуации лучше всего подойдёт вот это.
Код:
StringReplace()
Да и вообще, переменный шаблон для регулярного выражения крайне ненадёжен, применять его следует с особой осторожностью. А сами регулярные выражения должны быть оправданы эффективностью при конкретных потребностях.
 
Последнее редактирование:
Верх