试图从表单类别/名称版本中的字符串中匹配一些 Gentoo 包命名组件,由于其复杂性,我得出了这样的结论:
if [[ "$1" =~ ^([<>]?=?)(([^\/]+)\/)?([^[:space:]]+)-(([[:digit:]]+)?(\.([[:digit:]]+))*([a-z])?(_(alpha|beta|pre|rc|p)([[:digit:]]*))*(-(r([[:digit:]]+))?)?)?$ ]]; then
# use "${BASH_REMATCH[n]}" here to capture groups contents
fi
Run Code Online (Sandbox Code Playgroud)
它按照预期分割字符串<category/package-name-12345.25b_rc10-r7
:
Version specifier: <
Category: category
Package name: package-name
Version: 12345.25b_rc10-r7
Version, major: 12345
Version, minor: 25
Version, letter: b
Version, patch type: rc
Version, patch level: 10
Version, revision number: 7
Run Code Online (Sandbox Code Playgroud)
现在,我需要匹配和分割可能缺少版本的字符串,例如category/package-name
.
那么,有没有办法让上面的版本部分可选呢?
以上,这部分内容如下:
-(([[:digit:]]+)?(\.([[:digit:]]+))*([a-z])?(_(alpha|beta|pre|rc|p)([[:digit:]]*))*(-(r([[:digit:]]+))?)?)?
Run Code Online (Sandbox Code Playgroud)
我尝试将其更改为:
(-(([[:digit:]]+)?(\.([[:digit:]]+))*([a-z])?(_(alpha|beta|pre|rc|p)([[:digit:]]*))*(-(r([[:digit:]]+)))?))?
Run Code Online (Sandbox Code Playgroud)
它适用于没有版本的字符串,但似乎可选组阻止它匹配上面这样的稍微完整的字符串,它得到:
Version specifier:
Category: category
Package name: package-name-12345.25b_rc10-r7
Version:
Version, major:
Version, minor:
Version, letter:
Version, patch type:
Version, …
Run Code Online (Sandbox Code Playgroud)