正则表达式,用于使字符串中的双破折号失败

时间:2019-06-03 15:21:55

标签: regex regex-lookarounds regex-group regex-greedy

我有一个必须遵循的令牌(简单字符串)命名约定。双破折号是不同部分的分隔符。例如:

  • 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”一词将是我的比赛对象。理想状态应该是没有匹配项。

我已经尝试将否定的“向前看”(否定)与“反向引用”结合使用。但是在解决如此复杂的问题之前,我必须成为正则表达式专家。

如何解决此问题?

2 个答案:

答案 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组或更多组双破折号的字符串匹配,这是您所说的错误情况。 顺便说一句,如果您允许在相邻的“标记”中尾随/前导单破折号,则您的语法会含糊不清。