Регулярное выражение маршрута WebAPI с необязательными частями

Я хочу сопоставить метод действия WebAPI с URL-адресами в формате api/v2/l8n/{cultureCode}, но чтобы избежать конфликтов маршрута с другими методами, мне нужно ограничить параметр cultureCode только значениями, соответствующими регулярному выражению ^\w{2}(?:-\w{2})?$, т. е. sv и en-GB, но не hello.

У меня есть атрибут RoutePrefix в контроллере, который отвечает за api/v2/i8n, поэтому я попытался сопоставить действие с

[Route(@"{cultureString:regex(^\w{2}(?:-\w{2})?$)")]

но затем во время настройки была выдана ошибка о том, что {cultureString:regex(^\w{2 было неверным значением маршрута. Я попытался заменить \w{2} на \w\w, а также удалить @ и экранировать обратную косую черту, но вместо этого был представлен

Шаблон маршрута не может начинаться с символа '/' или '~' и не может содержать '?' персонаж.

Если я даже не могу использовать ?, как я могу создать регулярное выражение с дополнительной частью?


person Tomas Aschan    schedule 02.02.2015    source источник


Ответы (1)


Я надеюсь, что нет такого ограничения на оператор конвейера или оператор чередования, используя который и некоторые якоря, вы могли бы заставить его работать.

[Route(@"{cultureString:regex(^\w\w(-\w{2}|)$)}")]

Вышеприведенное означает, что оно соответствует либо двум \w, за которыми следуют еще два \w, либо концу строки, $

person Amit Joki    schedule 02.02.2015
comment
теперь он также соответствует dd-ddd. Я предлагаю вам использовать ^\w\w(-\w{2}|)$ - person Avinash Raj; 02.02.2015
comment
Могло бы сработать, но, к сожалению, не сработало: The inline constraint resolver of type 'DefaultInlineConstraintResolver' was unable to resolve the following inline constraint: 'regex(^\w\w(-\w\w|)$'. Любые идеи, как идти от этого? - person Tomas Aschan; 03.02.2015
comment
НВМ; в опубликованном решении отсутствовала закрывающая скобка и фигурная скобка, открытые {...:regex( - добавив их, это работает =) (я отредактировал ответ, чтобы включить это изменение.) - person Tomas Aschan; 03.02.2015
comment
@TomasLycken, извините, не смог ответить, так как был в школе. В любом случае, рад видеть, что вы смогли решить проблему. - person Amit Joki; 03.02.2015