首页 > 解决方案 > 使用正则表达式解析信息汇编版本

问题描述

我正在尝试使用正则表达式解析信息版本字符串。

版本字符串的外观有所不同

// CI Build
2020.2.18-preview.2-b5d95e5992d99f6a6eef8faf71c47df694c763bd

// CI Release Build
2020.2.18-b5d95e5992d99f6a6eef8faf71c47df694c763bd

// Local Build
2020.2.18-preview.0

// Other...
2020.2.18

在所有情况下,我都想检索以下部分

version = 2020.2.18
suffix = preview.0, preview.2 or empty
hash = b5d95e5992d99f6a6eef8faf71c47df694c763bd or empty

唯一必须存在的部分是版本部分。

我现在的表达是

(?<Version>(?>\d+\.?){3,})(?:-(?<Suffix>.*?))(?:-(?<Hash>[0-9a-f]{5,40}))

关于如何使后缀哈希成为可选的任何提示?

我尝试在其中任何一个上添加一个简单的零或一,但这不起作用。

标签: regex

解决方案


您可以使用

^(?<Version>(?>\d+\.?){3,})(?:-(?<Suffix>.*?))??(?:-(?<Hash>[0-9a-f]{5,40}))?$

要点:

  • ^匹配字符串的开头并$ 匹配字符串的结尾
  • (?:-(?<Suffix>.*?))??是一个可选的惰性模式,匹配 0 或 1 次,仅在下一个子模式不匹配时才尝试
  • (?:-(?<Hash>[0-9a-f]{5,40}))?是一个可选的贪心模式,尝试了 1 次或 0 次。

请参阅正则表达式演示


推荐阅读