сопоставьте круглые скобки в powershell с помощью регулярных выражений

#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._-)(] )$"