2

着信RESTURLを書き換えるために使用しようとしている正規表現があり、URLの1つのセクションが除外されると、1つのユースケースでスタックします。

これが私が現在使用している正規表現です:

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

例として、新しいURLを作成する際に使用する部分として「$ 1-$2-$3」を使用しています。

正しく機能している例を次に示します...

"/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 - "

私が必要としているのは、トピックがなく、ページ番号が$ 3のままであるため、$2を空白にすることです。出力として必要なもの...

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

正しく機能する既存のシナリオを中断することなく、そのシナリオを満たすために正規表現で何を変更できますか?これはJavaで行われています。

4

2 に答える 2

1

2番目のグループを貪欲にしないで十分です。次に、エンジンは最初にそれを使用せずに一致を見つけようとします(/page/\\d+代わりにのみ試行します)。それが失敗した場合は、2番目のグループを含めようとします。

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

あらゆる種類の数量詞(、、+および)を前に付けると*、貪欲になりません。?{..}?

于 2012-11-15T00:59:02.953 に答える
1

あなたは正規表現パターンを使おうとするかもしれません

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