JAX-RS / Jersey路径参数regex用于简单字符串

时间:2015-12-02 21:35:02

标签: java regex jersey jax-rs

我正在尝试匹配字符串v1v2。为此,我正在尝试以下正则表达式:^v(1|2)(我也试过$,这可能就是我需要的)。当我在http://www.regextester.com/中测试它时,似乎工作正常。但是当我在JAX-RS路径表达中使用它时,它不起作用。我使用的表达式如下:

@Path("/blah/{ver:^v(1|2)}/ep")

我缺少JAX-RS特有的东西吗?

2 个答案:

答案 0 :(得分:5)

由于锚^,您的尝试无效。引自JAX-RS specification, chapter 3.7.3(强调我的):

  

函数R(A)将URI路径模板注释A转换为正则表达式,如下所示:

     
      
  1. URI对模板进行编码,忽略URI模板变量规范。
  2.   
  3. 转义URI模板中的所有正则表达式字符,再次忽略URI模板变量规范。
  4.   
  5. 如果未指定正则表达式,则将每个URI模板变量替换为包含指定正则表达式的捕获组‘([ˆ/]+?)’
  6.   
  7. 如果结果字符串以‘/’结尾,则删除最后一个字符。
  8.   
  9. ‘(/.*)?’附加到结果中。
  10.   

由于每个URI模板都放在捕获组中,因此您无法在其中嵌入锚点。

因此,以下内容将有效,并将与v1v2匹配:

@Path("/blah/{ver:v[12]}/ep")

答案 1 :(得分:1)

尝试以下(没有锚点):

@Path("/blah/{ver : v(1|2)}/ep")

此外,如果更改只是单个字符,请使用字符集而不是|运算符:

@Path("/blah/{ver : v[12]}/ep")