字符串中双破折号失败的正则表达式
Regex for failing double dashes in a string
我有一个必须遵循的标记(简单字符串)命名约定。双破折号是不同部分的分隔符。例如:
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"这个词就是我匹配的一组。理想的状态应该是没有匹配项。
我已经尝试将否定的 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 个单破折号,您的语法就会有歧义。
我有一个必须遵循的标记(简单字符串)命名约定。双破折号是不同部分的分隔符。例如:
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"这个词就是我匹配的一组。理想的状态应该是没有匹配项。
我已经尝试将否定的 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 个单破折号,您的语法就会有歧义。