2

正規表現を書くのに多少の助けが必要です。私の Django アプリケーションでは、ユーザーは次の URL にアクセスできます。

http://www.example.com/A1/B2/C3

次のいずれかを有効な URL として受け入れる正規表現を作成したいと思います。

http://www.example.com/A1  
http://www.example.com/A1/B2  
http://www.example.com/A1/B2/C3  

「OR」条件を使用する必要があると思いますが、正規表現を検証するのに問題があります。何かご意見は?

更新: これまでの正規表現は次のとおりです。「 http://www.example.com 」の部分は含めていないことに注意してください。Django が処理してくれます。1、2、または 3 つのサブディレクトリを検証することに関心があります。

^(\w{1,20})|((\w{1,20})/(\w{1,20}))|((\w{1,20})/(\w{1,20})/(\w{1,20}))$
4

6 に答える 6

6

をスキップし、と|を使用?()

http://www\.example\.com/A1(/B2(/C3)?)?

A1-C3 をパターンに置き換えると、次のようになります。

http://www\.example\.com/[^/]*(/[^/]*(/[^/]*)?)?

説明:

  • で始まるすべての文字列に一致しますhttp://www.example.com/A1
  • それは、追加の および追加の/B2にも一致する可能性/C3/C3ありますが、一致するのは、/B2
  • [^/]*(できるだけ多くの非スラッシュ)
  • 特別なキャプチャ グループで A1-C3 が必要な場合は、これを使用できます。

http://www\.example\.com/([^/]*)(/([^/]*)(/([^/]*))?)?

( ) を与えるgroupnumber: content:

matches: 0: (http://www.example.com/dir1/dir2/dir3)
1: (dir1)
2: (/dir2/dir3)
3: (dir2)
4: (/dir3)
5: (dir3)

ここでオンラインでチェックアウトするか、このツールを入手できます(はい、無料で、Lisp で書かれています...)。

于 2008-10-09T14:02:13.133 に答える
3

これを行う Django の方法は他にもたくさんあります。

urlpatterns = patterns('',
    url(r'^(?P<object_slug1>\w{2}/(?P<object_slug2>\w{2}/(?P<object_slug3>\w{2})$', direct_to_template, {"template": "two_levels_deep.html"}, name="two_deep"),
    url(r'^(?P<object_slug1>\w{2}/(?P<object_slug2>\w{2})$', direct_to_template, {"template": "one_level_deep.html"}, name="one_deep"),
    url(r'^(?P<object_slug1>\w{2})$', direct_to_template, {"template": "homepage.html"}, name="home"),
)

他のメソッドは、Django の変数を渡す機能を利用していません。

編集: urlpattern の順序をパーサーにとってより明確になるように切り替えました (つまり、ボトムアップはトップダウンよりも明確です)。

于 2009-07-22T19:52:14.793 に答える
1

Django の逆引き URL マッチング(パーマリンクreverse(){% url %}) は、正規表現の限定されたサブセットを処理できることに注意してください。それらを使用できるようにするには、複雑な正規表現を個別の URL ディスパッチャ ルールに分割する必要がある場合があります。

于 2008-10-15T19:39:59.987 に答える
1
http://www\.example\.com/A1(/B2(/C3)?)?
于 2008-10-09T14:01:16.160 に答える
1
 ^(\w{1,20})(/\w{1,20})*

これは、2つだけが必要な場合に必要な数のサブディレクトリ用です。

 ^(\w{1,20})(/\w{1,20}){0,2}
于 2008-10-09T14:03:50.803 に答える
1

私が理解していれば、ORステートメント全体を囲む別の括弧のセットが必要だと思います:

^((\w{1,20})|((\w{1,20})/(\w{1,20}))|((\w{1,20})/(\w{1,20})/(\w{1,20})))$
于 2008-10-09T14:04:10.867 に答える