JAX-RS/Jersey路径参数正则表达式用于简单字符串

3
我正在尝试匹配字符串v1v2。为此,我正在尝试以下正则表达式:^v(1|2)(我还尝试了$,这可能是我需要的)。当我在http://www.regextester.com/上测试它时,似乎工作得很好。但是,当我在JAX-RS路径表达式中使用它时,它不起作用。我使用的表达式如下:@Path("/blah/{ver:^v(1|2)}/ep")。是否有任何特定于JAX-RS的事项我忽略了?

JAX-RS规范包含模板模式示例,这些示例不使用锚点(即^$),因此我猜测它们不应该被使用。无论它们是否是您问题的原因,我不能确定(我也没有可以测试的服务器)。 - VGR
@VGR,我刚刚查阅了规范,URI模板被放置在一个捕获组内(3.7.3),这就消除了锚点。 - Tunaki
@Tunaki,确实是这样。问题中存在“^”可能是匹配失败的原因。 - VGR
2个回答

5
您的尝试失败是因为锚点^。引用自JAX-RS规范第3.7.3章节(重点在于我):

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

  1. 对模板进行URI编码,忽略URI模板变量规范。
  2. 转义URI模板中的任何正则表达式字符,再次忽略URI模板变量规范。
  3. 用包含指定正则表达式或'([ˆ/]+?)'的捕获组替换每个URI模板变量,如果没有指定正则表达式,则使用'([ˆ/]+?)'
  4. 如果生成的字符串以'/'结尾,则删除最后一个字符。
  5. '(/.*)?'附加到结果。
由于每个URI模板都放置在捕获组内,因此您无法嵌入锚点。
因此,以下内容可以工作,并且将匹配v1v2
@Path("/blah/{ver:v[12]}/ep")

如果您想使用锚点,有没有其他选择? - 500865
为什么要使用锚点呢?我看不到匹配字符串开头或结尾的特定需求。 - Tunaki
此外,如果模板中没有正则表达式,则变量将被表达式“([^ /] +?)”替换,该表达式包含一个锚点。 - 500865
3
不,它在一个组内(即[]),所以它的意思是“不是/”。这里它不是锚点(虽然是同一个字符但意思不同)。 - Tunaki

1
请尝试以下内容(不包含锚点):
@Path("/blah/{ver : v(1|2)}/ep")

此外,如果更改只涉及单个字符,请使用字符集而不是|运算符:
@Path("/blah/{ver : v[12]}/ep")

1
JAX-RS规范没有关于冒号周围空格的说明,因此这可能会破坏模板解析或根本不起作用。 - VGR
是的,这个可以运行。为什么锚点不起作用呢?你能给我解释一下吗? - 500865
1
在Resteasy中需要在冒号周围留出空格(由于其中的一个错误)。 - Alkanshel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接