Regex 带正则表达式的JAX-RS-@Path参数
我正在尝试使用JSX-RS实现一个服务,在这里我遇到了一种情况,即在具有不同版本号的多种类型的请求中,应该通过单个方法来满足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])(
@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)。