我尝试使用以下约束构建复杂的正则表达式:
1。我的字符串只能由以下内容组成:
[ArgumentException: The key 'Access-Control-Allow-Origin' is already present in the dictionary.]
Microsoft.Owin.Host.SystemWeb.CallHeaders.AspNetResponseHeaders.Add(String key, String[] value) +178
IdentityServer3.AccessTokenValidation.ScopeRequirementMiddleware.EmitCorsResponseHeaders(IDictionary`2 env) in c:\local\identity\server3\AccessTokenValidation\source\AccessTokenValidation\Plumbing\ScopeRequirementMiddleware.cs:97
2。长度必须介于3到25之间
到目前为止它很容易,但后来变得复杂了:
第3。除非第一个是空格而第二个不是空格,否则不能有2个连续的特殊字符。 逻辑后果:不能有3个连续的特殊字符
4字符串无法以空格开头或结尾
我特别挣扎着3。 任何帮助/提示都将非常感激。
示例:
"Regular" alphanumeric characters : a-zA-Z0-9
4 specials characters : space . _ -
答案 0 :(得分:1)
尝试使用:
^(?:[a-zA-Z0-9]|[._-](?![ ._-]))(?:[a-zA-Z0-9 ]|[._-](?![ ._-])){1,23}[a-zA-Z0-9._-]$
部分[._-](?![ ._-])
表示"匹配[._-]
如果[ ._-]
后面没有。
一般情况下,您可以查看lookarounds
答案 1 :(得分:1)
我建议使用:
^ # Start of string
(?=.{3,25}$) # The total string length is from 3 to 25
[._-]? # An optional . _ or - (? means "match 1 or 0 times")
[a-zA-Z0-9]+ # one or more alphanumeric symbols
(?: # Zero or more sequences of:
(?:[._-]|[ ][._-]?) # one . _ or - OR a space followed with an optional . _ or -
[a-zA-Z0-9]+ # one or more alphanumerics
)* # (here * defines zero or more times)
[._-]? # one optional . _ or -
$ # End of string
请参阅每个部分的内联描述(我使用/x
VERBOSE(或自由空间)修饰符来启用有助于保持长模式可读的注释。
请参阅regex demo
更多模式详情
^
- 字符串anchor的开头,正则表达式引擎只会在字符串start处查找整个模式。因此,如果开头有空格,则不会返回任何匹配项[a-zA-Z0-9]+
,第一个强制性子模式需要字母数字,[._-]?
(a character class匹配一个或零.
,_
或-
(?
is a quantifier匹配的一个或零个匹配子模式)仅允许在第一个字母数字之前的这3个字符中的一个。(?=.{3,25}$)
是一个positive lookahead锚定在开头,需要至少3个字符,最多25个字符而不是换行符(.
匹配除LF以外的任何字符limiting quantifier /s
从开始到结束都没有定义1}}修饰符($
是在字符串末尾匹配的字符串结束锚,或者在作为换行符的最终字符之前匹配的字符串结束锚,如果你用\z
替换想要禁止在最后使用换行符号匹配字符串)。
{3,25}
是non-capturing group,允许匹配min
到max
个符合量化的子模式的字符数。请注意,前瞻不会消耗文本,即正则表达式引擎返回到开始将前瞻模式与true
或false
结果匹配的位置,如果true
,则继续匹配模式的其余部分。[._-]?
- 一个可选的单个字符,是字符类中定义的字符之一(参见上面的解释)[a-zA-Z0-9]+
- 一个或多个(我写了" 1 +")字符(+
量词匹配1次或多次出现)在字符中定义的范围内类。(?:(?:[._-]|[ ][._-]?)[a-zA-Z0-9]+)*
- 是alternation operator,仅用于对子图案进行分组(以匹配连续),可以匹配一个或多个(因为*
代表后它)(?:[._-]|[ ][._-]?)[a-zA-Z0-9]+
:(?:[._-]|[ ][._-]?)
- .
,_
或-
,或(由于|
RemoveUnpackWARs)空间(I将空格放入字符类[ ]
,因为我使用/x
VERBOSE修饰符将新行格式和注释引入模式中,如果不使用/x
,则可以使用常规空格修饰符)后跟.
,_
或-
。[a-zA-Z0-9]+
- 1个或更多(由于+
)字母数字。