Force -Match运算符失败表达式

duf*_*ney 2 regex powershell match

我正在使用表达式来验证Active Directory用户名.我这样做是通过创建一个否定的字符类并告诉它寻找任何不是"/\[]:; | =,+*?<>的东西.问题是当我使用-match操作符时它会匹配字符在技​​术上有效,如n或i,但我希望表达式失败,因为它也包含类似的东西!

'!nv,@l|d?' -match  '[^"/\\\[\]:;|=,+\*\?<>!]+'
Run Code Online (Sandbox Code Playgroud)

mkl*_*nt0 6

请尝试以下方法:

$username = '!nv,@l|d?'
$notValid = $username -match    '[]["/\\:;|=,+*?<>!]' 
$valid =    $username -notmatch '[]["/\\:;|=,+*?<>!]' 
Run Code Online (Sandbox Code Playgroud)

字符被当作是普通的正则表达式的元字符就文字并不需要一个内部特殊处理的字符集([...]),有两个例外:

  • Literal \仍然必须被转义为\\

  • ]并且[必须小心地放在字符集的开头,以免被误认为是字符集的分隔符.

字符集'[]["/\\:;|=,+*?<>!]'与输入中的每个字符进行匹配,因为整个表达式没有锚定,因此不需要诸如的量词+.

相反,使用您的字符类否定逻辑([^...]),您将不得不锚定整个表达式(^[^...]+$)以实现所需的结果 - 即,确保整个输入仅由非禁止字符组成.
如果没有输入的开始(^)和输入结束的锚点($),任何至少一个非禁止字符的运行都会匹配,可能会产生误报,例如您的样本输入.
虽然锚定您的否定字符集^[^...]+$以匹配整个输入也可以工作,但效率较低.