非贪心子组Ruby正则表达式匹配
Non-greedy subgroup Ruby regular expression matching
我正在尝试编写一个正则表达式来解析媒体类型字符串的供应商、版本和格式组件,其中版本将在最后一个破折号之后。例如:
- 匹配
"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']
.
这可能是无限数量的破折号让我陷入困境。
如果版本在最后一个破折号之后,则版本(和格式)不能包含破折号。只需将它们从字符 class.
中取出即可
/\Avnd\.([a-z0-9*.\-_!#$&\^]+?)(?:-([a-z0-9*.]+))?(?:\+([a-z0-9*.+]+))?\z/
正则表达式:
\Avnd\.(.+?)(?:-([^-+]+))?(?:\+(.*))?\z
细分:
\Avnd\.
匹配 vnd.
从字面上形成字符串的开头
(.+?)
匹配任何字符,尽可能少的次数 [group 1]
(?:-([^-+]+))?
可选。匹配 -
后跟任意数量的字符,除了 -
和 +
[组 2]
(?:\+(.*))?
可选。匹配 +
后跟任何字符。 [第 3 组]
\z
直到字符串结束。
我正在尝试编写一个正则表达式来解析媒体类型字符串的供应商、版本和格式组件,其中版本将在最后一个破折号之后。例如:
- 匹配
"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']
.
这可能是无限数量的破折号让我陷入困境。
如果版本在最后一个破折号之后,则版本(和格式)不能包含破折号。只需将它们从字符 class.
中取出即可/\Avnd\.([a-z0-9*.\-_!#$&\^]+?)(?:-([a-z0-9*.]+))?(?:\+([a-z0-9*.+]+))?\z/
正则表达式:
\Avnd\.(.+?)(?:-([^-+]+))?(?:\+(.*))?\z
细分:
\Avnd\.
匹配vnd.
从字面上形成字符串的开头(.+?)
匹配任何字符,尽可能少的次数 [group 1](?:-([^-+]+))?
可选。匹配-
后跟任意数量的字符,除了-
和+
[组 2](?:\+(.*))?
可选。匹配+
后跟任何字符。 [第 3 组]\z
直到字符串结束。