非贪心子组Ruby正则表达式匹配

Non-greedy subgroup Ruby regular expression matching

我正在尝试编写一个正则表达式来解析媒体类型字符串的供应商、版本和格式组件,其中版本将在最后一个破折号之后。例如:

到目前为止我得到的最接近的是

/\Avnd\.([a-z0-9*.\-_!#$&\^]+?)(?:-([a-z0-9*\-.]+))?(?:\+([a-z0-9*\-.+]+))?\z/

但与 "vnd.mycompany-foo_bar-v1+json" 匹配得到 ['mycompany', 'foo-bar-v1', 'json'].

这可能是无限数量的破折号让我陷入困境。

如果版本在最后一个破折号之后,则版本(和格式)不能包含破折号。只需将它们从字符 class.

中取出即可
/\Avnd\.([a-z0-9*.\-_!#$&\^]+?)(?:-([a-z0-9*.]+))?(?:\+([a-z0-9*.+]+))?\z/

正则表达式:

\Avnd\.(.+?)(?:-([^-+]+))?(?:\+(.*))?\z

regex101 Demo

细分:

  • \Avnd\. 匹配 vnd. 从字面上形成字符串的开头
  • (.+?) 匹配任何字符,尽可能少的次数 [group 1]
  • (?:-([^-+]+))? 可选。匹配 - 后跟任意数量的字符,除了 -+ [组 2]
  • (?:\+(.*))? 可选。匹配 + 后跟任何字符。 [第 3 组]
  • \z 直到字符串结束。