Как проверить тип содержимого с помощью регулярных выражений? - PullRequest
1 голос
/ 26 апреля 2019

Мне нужно проверить заголовок Accept запроса с помощью регулярных выражений (python).Регулярное выражение должно соответствовать application / json или application / jose + jwe и дополнительным параметрам (charset = utf8 и значение q).

Первоначально требовалось принимать только значения application / json и q и никаких других типов mimi.У меня было следующее регулярное выражение, которое сработало:

(^application/json;q=(0|1|(0\.[1-9]))$)|(^application/json$)

Я знаю, что мне нужно иметь возможность включить параметр charset в charset=utf8 и иметь возможность сопоставления в любом месте строки.

Я новичок в регулярных выражениях и создал следующее регулярное выражение, но оно не соответствует всем требованиям (https://regex101.com/r/vFMCcI/11) -

(application/json; q=(0|1|(0\.[1-9])))$|(application\/json; charset=utf8)|(application\/json; charset=utf8 q=(0|1|(0\.[1-9])))|(application/json)

Тестовые строки

application/json,
application/json; q=0.2
application/json; charset=utf8
application/json; q=0.2 charset=utf8
application/json; charset=utf8 q=0.2
text/html, application/json; q=0.2, application/pdf

application/jose+jwe
application/jose+jwe; q=0.2
application/jose+jwe; charset=utf8
application/jose+jwe; q=0.2 charset=utf8
application/jose+jwe; charset=utf8 q=0.2
text/html, application/jose+jwe; q=0.2, application/pdf
  1. Почему я получаю только частичные совпадения для application/json; charset=utf8 q=0.2?
  2. Регулярное выражение становится слишком длинным, когда application / jose + jwe даже не включено.мс на запросы. Какие-либо указатели на это могут быть лучше оптимизированы?

РЕДАКТИРОВАТЬ:

Значение Q должно быть 0-1 и только до 1 десятичного знака

0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1

Единственное допустимое значение кодировки: charset=utf8

Спасибо

Ответы [ 2 ]

2 голосов
/ 26 апреля 2019

Вот более конкретный шаблон.

^application\/(json|jose\+jwe)(;(( q=(1|0\.\d))|( charset.utf8))+)?$

Это будет соответствовать тому, что вы описали выше.В первом тесте есть запятая, но я не был уверен, хотите ли вы включить это.Это простое добавление.

^application\/(json|jose\+jwe)(;(( q=(1|0\.\d))|( charset.utf8))+)?,?$
1 голос
/ 26 апреля 2019

Попробуйте это регулярное выражение.Он работает с опциональным «q» и опциональным «charset»

application\/(json|jose\+jwe)(;\s)?((charset=utf8|q=[0-1]\.\d)(\s)?)*

https://regex101.com/r/ABjXH4/5

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...