我正在处理表达式以验证Active Directory用户名。我通过创建一个否定的角色类并告诉它寻找任何不是" / \ []:; | =,+ *? <取代。问题是,当我使用-match运算符时,它将匹配技术上有效的字符,如n或i,但我希望表达式失败,因为它还包含类似的内容!
'!nv,@l|d?' -match '[^"/\\\[\]:;|=,+\*\?<>!]+'
答案 0 :(得分:6)
尝试以下方法:
$username = '!nv,@l|d?'
$notValid = $username -match '[]["/\\:;|=,+*?<>!]'
$valid = $username -notmatch '[]["/\\:;|=,+*?<>!]'
要被视为通常为正则表达式元字符的文字的字符不需要在字符集([...]
)中进行特殊处理,但有两个例外:< / p>
文字\
仍必须转发为\\
]
和[
必须小心地放在字符集的开头,以免被误认为分隔符字符集的em>。
字符集'[]["/\\:;|=,+*?<>!]'
与输入中的每个字符匹配,因为整个表达式不是锚定,所以没有需要量化器,如+
。
相反,使用您的角色类否定逻辑([^...]
),您将不得不将整个表达式(^[^...]+$
)锚定到达到预期的结果 - 即确保整个输入仅由非禁止字符组成
如果没有输入开始(^
)和输入结束锚点($
),任何至少一个非禁止字符的运行都会匹配,可能产生误报,例如你的样本输入
虽然使用^[^...]+$
锚定您的否定字符集以匹配整个输入也会起作用,但效率较低。