2011-05-19 40 views
4

我试图检查无效的文件名。我想要一个文件名只包含小写,大写,数字,空格,句点,下划线,破折号和括号。我试过这个表达式:在PowerShell中使用正则表达式匹配括号

$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" 

我在做什么错?

回答

6

尝试将-移动到它需要一个字符类中间的字符类

^([a-zA-Z0-9\s\._\)\(-]+)$ 

月底另行逃脱它定义了一个范围

1

我猜,加上一个反斜杠在连字符之前:

$regex = [regex]"^([a-zA-Z0-9\s\._\-\)\(]+)$" 
2

您可以用\ w替换a-zA-Z0-9和_。

$regex = [regex]"^([\w\s\.\-\(\)]+)$" 

从获取帮助about_Regular_Expressions:

\ W

匹配所有文字字符。 等效于Unicode 字符类别[\ p {ll} \ p {Lu} \ p {Lt} \ p {Lo} \ p {Nd} \ p {Pc}]。 如果ECMAScript 选项指定ECMAScript兼容行为 ,则\ w等效于 [a-zA-Z_0-9]。

+0

此外,您可能不需要^或$,因为这些表示行/字符串的开始或行结束/字符串 – 2016-01-22 14:12:37