2

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

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

这应该迎合 -

/url1/url2
/url1/url2/v1
/url1/url2/v1.2

其中版本分别为 0、1 和 1.2。

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

我需要将其限制为仅在 v 之后和小数点 (.) 之后的一位数字,并且我只需要出现一次 /v*。例如 -

/ur1/url2/v1v1不允许

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

另一种方法是针对每个版本,我有一个带有@path 参数的单独方法。最后哪个是最好的解决方案?

非常欢迎任何建议或想法!

4

1 回答 1

1

好的,这就是我这样做的方式:

首先, thev是可选的,因为您必须接受/url1/url2. 所以,我将从:

(/v)?

?意味着零次或一次。

现在,如果你放 a/v那么你必须在它之后有一个版本数字(即/v1),但这只是你放第/v一个,对吧?

有点像:(/v\d)?

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

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

所以,有点像这样:

(/v\d(\.\d)?)?

请注意,我用 a\.来表示我们期望这里有一个“点”。之所以如此,是因为.它是一个预定义的正则表达式字符类,它代表任何字符,因此您必须对其进行转义以表示您期望一个".".

因此,这适用于您提供的所有测试场景。

于 2013-01-11T23:36:08.037 回答