我正在尝试检查无效的文件名。我希望文件名只包含小写,大写,数字,空格,句号,下划线,短划线和括号。我试过这个正则表达式:
$regex = [regex]"^([a-zA-Z0-9\s\._-\)\(]+)$"
$text = "hel()lo"
if($text -notmatch $regex)
{
write-host 'not valid'
}
我收到此错误:
Error: "parsing "^([a-zA-Z0-9\s\._-\)\(]+)$" - [x-y] range in reverse order"
我做错了什么?
答案 0 :(得分:6)
尝试将-
移动到角色类的末尾
^([a-zA-Z0-9\s\._\)\(-]+)$
在字符类的中间需要进行转义,否则它会定义一个范围
答案 1 :(得分:2)
您可以用\ w替换a-zA-Z0-9和_。
$regex = [regex]"^([\w\s\.\-\(\)]+)$"
来自get-help about_Regular_Expressions:
\ W
匹配任何单词字符。 相当于Unicode 字符类别[\ p {Ll} \ p {路} \ p {LT} \ p {螺} \ p {钕} \ p {PC}]。 如果符合ECMAScript的行为 使用ECMAScript指定 选项,\ w等同于 [A-ZA-Z_0-9]。
答案 2 :(得分:1)
我猜,在单独的连字符前添加一个反斜杠:
$regex = [regex]"^([a-zA-Z0-9\s\._\-\)\(]+)$"