Spring映射正则表达式

时间:2015-02-21 19:07:17

标签: regex spring-mvc

我有一个需要提供两个GET实现的控制器。 第一个返回一个字符串,应该映射到如下所示的路径:

  

/配置/类别/子类别1 /..../的PropertyValue

第二个返回一个地图,应该映射到看起来像这样的路径

  

/配置/类别/子类别1 /..../ subCategory4 /

基本上区别在于一条路径以" /"结尾。而另一个没有。我尝试了几个选项,但没有一个适用于多个子类别。

感谢您的想法。

1 个答案:

答案 0 :(得分:0)

第一种模式很简单,至少基于您的基本示例。您可能希望删除开头\/

\/config/([^\/]+)\/.+\/(.+)

我假设config/是静态的,所以我们将把它排除在外...之后,我们捕获所有不是正斜杠的东西,它会在遇到正斜杠时停止。这是反向引导#1。我们添加一个静态正斜杠,然后捕获所有内容,直到最后一个正斜杠,放入一个静态正斜杠,然后在最后一个正斜杠之后捕获所有内容直到字符串结尾。

至于第二种模式

假设你有类似这样的类别模式

/config/Computers/Hardware/Storage/Hard_Drives

正则表达式无法将无限递归作为单独的变量捕获,但您可以像这样捕获一个变量

/config/([^\/]+)(\/[^\/]+)+

通过上面的示例,反向引用包含Computers,反向引用2包含/Hardware/Storage/Hard_Drives

你可以设计像这样的正则表达式

/config/([^\/]+)(?:\/([^\/]+))?(?:\/([^\/]+))?(?:\/([^\/]+))?(?:\/([^\/]+))?(?:\/([^\/]+))?

最多可达五级......并将每个类别捕获为自己的反向引用。如果您需要匹配更深的匹配,则可以在该行的末尾添加另一个(?:\/([^\/]+))?