我有一个必须遵循的标记(简单字符串)的命名约定。双破折号是不同部分的分隔符。例如:
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“将是我匹配的一组。期望的状态应该是,没有匹配项。
我已经尝试将被否定的前视(negation)与反向引用结合使用。但在解决如此复杂的问题之前,我必须成为一名正则表达式专家。
我该如何解决这个问题?
发布于 2019-06-03 23:30:15
如果您的令牌可以包含前导和尾随-
,则可以使用
^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+字母/数字。
发布于 2019-06-04 03:27:11
所有这些都需要在一个正则表达式中完成吗?如果是这样的话,可能会采用Wiktor的解决方案。如果您正在编写可以使用多个正则表达式的代码,一个简单的方法就是在匹配的情况下抛出“不匹配”代码:
".*--.+--.+--.+--.*"
它应该匹配任何具有4组或更多双短划线的字符串,这是您声明的错误情况。顺便说一句,如果你允许在相邻的"tokens“中使用尾随/前导的单破折号,那么你的语法就会有歧义。
https://stackoverflow.com/questions/56430308
复制相似问题