我有一个必须遵循的令牌(简单字符串)命名约定。双破折号是不同部分的分隔符。例如:
ActiveDirectory--User--<LastName>--Password
ActiveDirectory--App--<DisplayName>--Secret
现在,我要检查令牌是否遵循命名约定。
命名约定说,令牌只能包含a-z,A-Z,0-9或破折号(-)。 <CustomName>
内不允许使用双破折号。
正则表达式
^ActiveDirectory--User--([a-zA-Z0-9-]*)--Password$
如果您输入以下令牌,则可以正常工作
ActiveDirectory--User--Smith--Password
,
但它不会像这样检查双破折号
ActiveDirectory--User--Sm--ith--Password
。
在这种情况下,“ Sm--ith”一词将是我的比赛对象。理想状态应该是没有匹配项。
我已经尝试将否定的“向前看”(否定)与“反向引用”结合使用。但是在解决如此复杂的问题之前,我必须成为正则表达式专家。
如何解决此问题?
答案 0 :(得分:2)
如果令牌的开头和结尾可以是-
,则可以使用
^ActiveDirectory--User--((?:(?!--)[a-zA-Z0-9-])*)--Password$
请参见regex demo。在这里,(?:(?!--)[a-zA-Z0-9-])*
匹配0个或多个ASCII字母或数字或连字符,但如果与下一个字符一起等于--
,则不匹配该字符。
如果令牌不能以-
开头/结尾,请使用
^ActiveDirectory--User--([a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)--Password$
请参见another demo。在这里,[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*
匹配1+个字母/数字,然后匹配0个或更多重复的-
和1+个字母/数字。
答案 1 :(得分:1)
这是否需要在一个正则表达式中完成?如果是这样,则可能采用Wiktor的解决方案。 如果您编写的代码可以使用多个正则表达式,则一种简单的方法是在符合条件的情况下抛出“不匹配”代码:
".*--.+--.+--.+--.*"
这应该与任何带有4组或更多组双破折号的字符串匹配,这是您所说的错误情况。 顺便说一句,如果您允许在相邻的“标记”中尾随/前导单破折号,则您的语法会含糊不清。