2015-10-02 23 views
-1

我正在嘗試編寫一個正則表達式來解析媒體類型字符串的供應商,版本和格式組件,其中版本將在最終破折號之後。例如:非貪心小組Ruby正則表達式匹配

  • "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']

這是可能無限數量的破折號扔我循環。

回答

4

正則表達式:

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

regex101 Demo

擊穿:

  • \Avnd\.相配vnd.字面上形成字符串的開始
  • (.+?)匹配任何炭,儘可能少次[第1組]
  • (?:-([^-+]+))?可選。匹配-後跟任意數量的字符的不同之處-+ [第2組]
  • (?:\+(.*))?可選。匹配+後跟任何字符。 [組3]
  • \z直到字符串結束。
+0

OP正確使用了'\ A'和'\ z'。爲什麼要將它們改爲常用的'^'和'$'? – sawa

+0

爲什麼在使用'+'作爲版本時使用'*'作爲格式組件? – sawa

+0

@sawa'^'和'$'沒有錯誤。只要不設置多行,它們就匹配字符串的開頭和結尾。至於量詞,這是因爲,正如我解釋的那樣,供應商可以有一個'-',但它不能有'+'。因此,'vnd.cpy-'應該考慮'company =「cpy-」',而'vnd.cpy +'應該被視爲空格式。 – Mariano

0

如果版本位於最後一個破折號之後,則版本(和格式)不能包含破折號。把他們帶出角色班。

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