Force -Match运算符失败表达式

时间:2016-11-10 03:26:57

标签: regex powershell match

我正在处理表达式以验证Active Directory用户名。我通过创建一个否定的角色类并告诉它寻找任何不是" / \ []:; | =,+ *? <取代。问题是,当我使用-match运算符时,它将匹配技术上有效的字符,如n或i,但我希望表达式失败,因为它还包含类似的内容!

'!nv,@l|d?' -match  '[^"/\\\[\]:;|=,+\*\?<>!]+'

1 个答案:

答案 0 :(得分:6)

尝试以下方法:

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

要被视为通常为正则表达式元字符的文字的字符需要在字符集[...])中进行特殊处理,但有两个例外:< / p>

  • 文字\仍必须转发为\\

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

字符集'[]["/\\:;|=,+*?<>!]'输入中的每个字符匹配,因为整个表达式不是锚定,所以没有需要量化器,如+

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