2

我有一个正则表达式,我试图用它来重写传入的 REST url,当 URL 的一部分被排除时,我陷入了一个用例。

这是我目前正在使用的正则表达式:

^(/[^/]+/(?:books))/([^/]+?)(?:/(?:(?!page).+?))?(?:/page/(\\d+))?$

例如,我使用“$1 - $2 - $3”作为编写新 URL 的部分。

以下是正常工作的示例...

"/mySite/books/topic1/page/2" results in "/mySite/books - topic1 - 2"
"/mySite/books/topic1/subtopic1/page/2" results in "/mySite/books - topic1 - 2"

以上所有工作都按预期进行。问题是当 URL 排除 URL 的“topic1”部分时,结果不是我需要的。例子:

"/mySite/books/page/2" results in "/mySite/books - page - "

我需要的是 $2 为空白,因为没有主题,并且页码仍然为 $3。我需要什么作为输出...

"/mySite/books/page/2" results in "/mySite/books -  - 2"

我可以在我的正则表达式中进行哪些更改以满足该场景,而不会破坏现有的正常工作?这是在 Java 中完成的。

4

2 回答 2

1

您可以尝试使用正则表达式模式

^(/[^/]+/books)/(?:(?!page/)([^/]+)/)?page/(\\d+)$
于 2012-11-15T01:50:23.677 回答
1

让你的第二组不贪婪就足够了。然后引擎将首先尝试在不使用它的情况下找到匹配项(仅尝试/page/\\d+)。如果失败,它会尝试包含第二组:

^(/[^/]+/(?:books))/([^/]+?)(?:/(?:(?!page).+?))??(?:/page/(\\d+))?$

前置任何类型的量词(, 和+with *)使其变得不贪婪。?{..}?

于 2012-11-15T00:59:02.953 回答