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

Regex for failing double dashes in a string

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

现在我想检查令牌是否遵循命名约定。

命名约定规定令牌只能包含 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"这个词就是我匹配的一组。理想的状态应该是没有匹配项。

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

如何解决这个问题?

如果您的令牌可以有前导和尾随 -,您可以使用

^ActiveDirectory--User--((?:(?!--)[a-zA-Z0-9-])*)--Password$

regex demo。此处,(?:(?!--)[a-zA-Z0-9-])* 匹配 0 个或多个 ASCII 字母或数字或连字符,但如果与下一个字符一起等于 --.

,则不匹配字符

如果您的令牌不能 start/end 与 -,请使用

^ActiveDirectory--User--([a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)*)--Password$

参见 another demo。这里,[a-zA-Z0-9]+(?:-[a-zA-Z0-9]+)* 匹配 1+ letters/digits,然后匹配 0 次或多次 - 和 1+ letters/digits.

是否所有这些都需要在一个正则表达式中完成?如果是这样,可能会采用 Wiktor 的解决方案。 如果您正在编写可以使用多个正则表达式的代码,一个简单的方法是在匹配时抛出您的 "no match" 代码:

".*--.+--.+--.+--.*"

这应该匹配具有 4 组或更多组 double-dashes 的任何字符串,这是您陈述的错误情况。 顺便说一句,如果您允许在相邻 "tokens" 中使用 trailing/leading 个单破折号,您的语法就会有歧义。