#regex #powershell
#регулярное выражение #powershell
Вопрос:
Я пытаюсь проверить, нет ли недопустимых имен файлов. Я хочу, чтобы имя файла содержало только строчные и прописные буквы, цифры, пробелы, точки, подчеркивания, тире и круглые скобки. Я пробовал это регулярное выражение:
$regex = [regex]"^([a-zA-Z0-9s._-)(] )$"
$text = "hel()lo"
if($text -notmatch $regex)
{
write-host 'not valid'
}
Я получаю эту ошибку:
Error: "parsing "^([a-zA-Z0-9s._-)(] )$" - [x-y] range in reverse order"
Что я делаю не так?
Ответ №1:
Попробуйте переместить -
в конец символьного класса
^([a-zA-Z0-9s._)(-] )$
в середине символьного класса его необходимо экранировать, иначе он определяет диапазон
Ответ №2:
Вы можете заменить a-zA-Z0-9 и _ на w .
$regex = [regex]"^([ws.-()] )$"
Из get-help about_Regular_Expressions:
w
Соответствует любому символу word. Эквивалентно категориям символов Юникода [p{Ll} p{Lu}p{Lt}p{Lo} p{Nd} p{Pc}]. Если с помощью опции ECMAScript указано поведение, совместимое с ECMAScript, w эквивалентно [a-zA-Z_0-9].
Комментарии:
1. Кроме того, вам может не понадобиться ^ или $, поскольку они представляют начало строки или конец строки
Ответ №3:
Я думаю, добавьте обратную косую черту перед единственным дефисом:
$regex = [regex]"^([a-zA-Z0-9s._-)(] )$"