问题陈述:
我正在尝试构建一个正则表达式,它接受两个连续的特殊字符,例如:/_
或\\
或./
或--
或\-
或任何其他特殊字符组合(./\_-
),在下面提到的正则表达式中:
^[a-zA-Z0-9\d]{1}[a-zA-Z0-9\d._/\-]{0,49}$
我在这里做错了什么?
答案 0 :(得分:2)
0-9
,因为它已被\d
覆盖。
^[a-zA-Z\d](?:[a-zA-Z\d]|(?<![._/\\\-])[._/\\\-]){0,49}$
部分(?:[a-zA-Z\d]|(?<![._/\\\-])[._/\\\-])
匹配字母数字字符,或特殊字符.
,_
,/
,\
,-
它已经不是一个特殊的角色了。我还使该组无法捕获(?:pattern)
,因为似乎正则表达式仅用于验证。
我利用零宽度负面后瞻断言(?<!pattern)
断言前面的字符不是特殊字符之一。
答案 1 :(得分:1)
这个正则表达式似乎符合你的要求
^[a-zA-Z0-9\d](?(?<=[\._/\\-])[a-zA-Z0-9\d]|[a-zA-Z0-9\d\._/\\\-]){0,49}$
实施例
Regex.IsMatch("a-12--3", Pattern); //false
Regex.IsMatch("a-12-3", Pattern); //true
我使用了conditional (?true|false)
语法来指示如果前面的字符(在进入中间组之前)是标点字符之一,则只有非标点符号可以跟随它,否则允许任何指定的字符。
(?<=expression)
语法为zero-width positive look-behind。