使用"条件"构建复杂的正则表达式

时间:2016-06-24 09:48:26

标签: php regex

我尝试使用以下约束构建复杂的正则表达式:

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 . _ -

2 个答案:

答案 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,允许匹配minmax个符合量化的子模式的字符数。请注意,前瞻不会消耗文本,即正则表达式引擎返回到开始将前瞻模式与truefalse结果匹配的位置,如果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个或更多(由于+)字母数字。