2014-02-07 75 views
1

我写了一个正则表达式,该正则表达式与符合Semantic Versioning 2.0.0规范的字符串匹配(请参见下文)。正则表达式匹配非零前缀数字*或*字母数字

该表达式的中间部分处理解析预发布版本。本部分的前缀为连字符( - ),可以有一个或多个以句点(。)分隔的标识符。每个标识符都是字母数字(0-9,A-Z,a-z或连字符),但如果标识符是数字,则必须使用而不是以前导零开头。

是否有一种更简洁的方式来表示我用来执行非零前缀规则的替代组?

该正则表达式适用于.NET,使用'x'模式编写,以允许注释并忽略空白。

^ 

# ==================================== 
# Main Major.Minor.Path version number 
# ==================================== 
(?<version> 
    (?<major>[1-9]\d*|0) 
    \. 
    (?<minor>[1-9]\d*|0) 
    \. 
    (?<patch>[1-9]\d*|0) 
) 

# =========================== 
# Optional preprelease string 
# =========================== 
(?: 
    -         # Hyphen indicates start of prerelease. 
    (?<prerelease> 
     #====================================================================== 
     # CONFUSION STARTS HERE 
     (?: 
      [1-9]\d*     # Numeric identifier (no leading zero). 
      | 
      [A-Za-z-]+     # Alpha identifier. 
      | 
      \d+[A-Za-z-]+[0-9A-Za-z-]* # Alphanumeric starting w/ numeric. 
      | 
      [A-Za-z-]+\d+[0-9A-Za-z-]* # Alphanumeric starting w/ alpha. 
     ) 
     # CONFUSION ENDS HERE - ish 
     #====================================================================== 
     (?: 
      \.       # start of another identifier. 
      (
       [1-9]\d* 
       | 
       [A-Za-z-]+ 
       | 
       \d+[A-Za-z-]+[0-9A-Za-z-]* 
       | 
       [A-Za-z-]+\d+[0-9A-Za-z-]* 
      ) 
     )* 
    ) 
)? 

# ===================== 
# Optional build string 
# ===================== 
(?: 
    \+         # Plus sign indicates start of build string. 
    (?<build> 
     [0-9A-Za-z-]+ 
     (?: 
      \.       # start of another identifier. 
      [0-9A-Za-z-]+ 
     )* 
    ) 
)? 

$ 

我认为解决方案可能与lookaround运算符有关,但我不知道如何去做。

+0

看起来好,最新的问题是什么? – sln

+0

本身没有问题,@sln。虽然这是一个相当长的正则表达式,我想知道是否有可能降低中间部分的复杂性并使其意图更明显。我在想那些跟着我的人,真的。我不亲切吗? ;) –

回答

1

可能能够缩短了预发行位
编辑
添加了一个可能的修复为[1-9]通过回溯被可能的困扰。
使用向前看。

(?: 
     - 
     (?<prerelease> 
      (?: 
       [1-9] \d* (?![\w-]) 
       | \d+ [A-Za-z-]+ [0-9A-Za-z-]* 
       | [A-Za-z-]+ (?: \d+ [0-9A-Za-z-]*)? 
      ) 
      (?: 
       \. 
       (?: 
         [1-9] \d* (?![\w-]) 
        | \d+ [A-Za-z-]+ [0-9A-Za-z-]* 
        | [A-Za-z-]+ (?: \d+ [0-9A-Za-z-]*)? 
       ) 
      )* 
     ) 
)? 
+0

嗯,整齐解决回溯问题。 –

相关问题