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

时间:2015-10-02 04:52:43

标签: ruby regex media-type

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

  • "vnd.mycompany-foo-bar-v1+json"上的匹配应生成['mycompany-foo-bar', 'v1', 'json']
  • "vnd.mycompany-v1+json"上的匹配应生成['mycompany', 'v1', 'json']
  • "vnd.mycompany+json"上的匹配应生成['mycompany', nil, 'json']
  • "vnd.mycompany-foo-bar-v1"上的匹配应生成['mycompany-foo-bar', 'v1', nil]

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

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

但是对“vnd.mycompany-foo_bar-v1 + json”匹配给了我['mycompany', 'foo-bar-v1', 'json']

这可能是无限数量的破折号,它让我陷入了一个循环。

2 个答案:

答案 0 :(得分:4)

<强>正则表达式:

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

regex101 Demo

<强>击穿:

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

答案 1 :(得分:0)

如果版本位于最终破折号之后,则版本(和格式)不能包含破折号。把它们带出角色类。

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