(?P<eq>^[\d.]+$)|(?:^\[(?P<heq>[\d.]+)\]$)|(?:(?P<or>(?<=\]|\)),(?=\[|\())|,|(?:(?<=,)(?:(?P<lte>[\d.]+)\]|(?P<lt>[\d.]+)\)))|(?:(?:\[(?P<gte>[\d.]+)|\((?P<gt>[\d.]+))(?=,)))+
Regex перейдет к версии соответствия в следующем порядке:
- Сначала попробуйте соответствовать «мягкому» требованию, используя:
(?P<eq>^[\d.]+$)
- Затем попробуйте соответствовать «жесткому» требованию, используя:
(?:^\[(?P<heq>[\d.]+)\]$)
- В противном случае попробуйте сопоставить диапазоны в следующем порядке:
- Сначала определите, является ли это множественный набор, используя:
(?:(?P<or>(?<=\]|\)),(?=\[|\())
который будет соответствовать только наборам, разделяющим запятую.
- Затем попробуйте сопоставить запятые в пределах одного и того же набора, используя:
,
.
- Затем выполняется сопоставление с фактическими диапазонами:
- начать сопоставление значения верхней границы, используя
(?:(?<=,)(?:(?P<lte>[\d.]+)\]|(?P<lt>[\d.]+)\)))
- тогда нижнее граничное значение, используя
(?:(?:\[(?P<gte>[\d.]+)|\((?P<gt>[\d.]+))(?=,))
Результат версий, включенных в спецификацию, будет:
| version | eq | heq | gte | gt | or | lte | lt |
| ------------- | --- | --- | --- | --- | -- | --- | --- |
| 1.0 | 1.0 | | | | | | |
| [1.0] | | 1.0 | | | | | |
| (,1.0] | | | | | | 1.0 | |
| [1.2,1.3] | | | 1.2 | | | 1.3 | |
| [1.0,2.0) | | | 1.0 | | | | 2.0 |
| [1.5,) | | | 1.5 | | | | |
| (,1.0],[1.2,) | | | 1.2 | | , | 1.0 | |
| (,1.1),(1.1,) | | | | 1.1 | , | | 1.1 |