我正在尝试编写一个正则表达式来解析媒体类型字符串的供应商,版本和格式组件,其中版本将在最后一个破折号之后。例如:
"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']
。
这可能是无限数量的破折号,它让我陷入了一个循环。
答案 0 :(得分:4)
<强>正则表达式:强>
\Avnd\.(.+?)(?:-([^-+]+))?(?:\+(.*))?\z
<强>击穿:强>
\Avnd\.
匹配vnd.
字面上形成字符串的开头(.+?)
匹配任何字符,尽可能少[第1组] (?:-([^-+]+))?
可选。匹配-
后跟除-
和+
[组2] (?:\+(.*))?
可选。匹配+
后跟任何字符。 [第3组] \z
直到字符串结束。答案 1 :(得分:0)
如果版本位于最终破折号之后,则版本(和格式)不能包含破折号。把它们带出角色类。
/\Avnd\.([a-z0-9*.\-_!#\$&\^]+?)(?:-([a-z0-9*.]+))?(?:\+([a-z0-9*.+]+))?\z/