Regex 带正则表达式的JAX-RS-@Path参数

Regex 带正则表达式的JAX-RS-@Path参数,regex,path,jax-rs,Regex,Path,Jax Rs,我正在尝试使用JSX-RS实现一个服务,在这里我遇到了一种情况,即在具有不同版本号的多种类型的请求中,应该通过单个方法来满足 @Path("/url1/url2{version: [[/v][0-9][.][0-9]]*}") 这应顾及— /url1/url2 /url1/url2/v1 /url1/url2/v1.2 /url1/url2 /url1/url2/v1 /url1/url2/v1.2 其中版本分别为0、1和1.2 我有正确的正则表达式,但代码似乎不接受它 ((/v[0-9])(

我正在尝试使用JSX-RS实现一个服务,在这里我遇到了一种情况,即在具有不同版本号的多种类型的请求中,应该通过单个方法来满足

@Path("/url1/url2{version: [[/v][0-9][.][0-9]]*}")
这应顾及—

/url1/url2 /url1/url2/v1 /url1/url2/v1.2 /url1/url2 /url1/url2/v1 /url1/url2/v1.2 其中版本分别为0、1和1.2

我有正确的正则表达式,但代码似乎不接受它
((/v[0-9])([0-9])?)
?我在这里感到困惑

我需要将它限制为v后面和小数点(.)后面的一个数字,并且只需要出现一次/v*。比如说-

/ur1/url2/v1v1
不允许

另外,我想知道性能方面,如果我有一个带有小数点的url,是否会花费我更多的时间来解析它。我必须对它进行url编码吗?如有任何其他建议,将不胜感激

另一种方法是对于每个版本,我都有一个单独的方法@path param。哪一个最终是最好的解决方案


欢迎提出任何建议或想法

好的,我就是这样做的:

首先,
v
是可选的,因为您必须接受类似于
/url1/url2
的模式。因此,我首先要说:

(/v)?
表示零次或一次

现在,如果你把一个
/v
放在后面,那么你必须在后面有一个版本数字(即
/v1
),但这只是如果你把
/v
放在第一位,对吗

有点像:
(/v\d)?

无需为数字
\d
指定量词,因为默认情况下为一个。由于使用了
量词,整个组可以出现零次或一次

现在,如果您输入一个版本数字,那么您可以选择输入第二个版本数字,用点分隔(即
/v1.1
)。但这仅在您首先使用版本号时有效,并且此组是可选的。如果它出现,它应该只出现一次,因此我们可以对这个组再次使用量词

所以,有点像这样:

(/v\d(\.\d)?)?
请注意,我使用了一个
\.
来表示我们希望这里有一个“点”。之所以如此,是因为
是一个预定义的正则表达式字符类,它表示任何字符,因此必须对其进行转义,以表示希望使用


因此,对于您提供的所有测试场景,这对我都有效。

我也尝试过这个-/url1/url2{version:[/v{0,1}\\d{0,1}.{0,1}\\d{0,1}]*它可以工作,但我不能将v限制为1,并且不能再次将数字限制为1…如果我删除*则没有版本参数它将无法工作..版本参数在这里是可选的…谢谢Edwin..我曾尝试使用类似的方法,但不知怎的,我的javax.ws.rs.Path似乎不接受这一点…它给出了编译错误-无效e序列(有效的是\b\t\n\f\r\“\'\\”),这是正确的,因为Java将\解释为转义字符。您必须使用\\(即\\d而不仅仅是\d)。