expressão regular que usa um "OU" condicional

votos
2

Eu poderia usar alguma ajuda para escrever uma expressão regular. Na minha aplicação Django, os usuários podem bater o seguinte URL:

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

Eu gostaria de criar uma expressão regular que permite que aceita qualquer um dos seguintes como uma URL válida:

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

Eu estou supondo que eu preciso para usar o OR condicional, mas estou tendo problemas para obter meu regex para validar. Alguma ideia?

ATUALIZAÇÃO : Aqui está a regex até agora. Note que eu não ter incluído o http://www.example.com porção - Django lida com isso para mim. Estou apenas preocupado com a validação 1,2, ou 3 subdiretórios.

^(\w{1,20})|((\w{1,20})/(\w{1,20}))|((\w{1,20})/(\w{1,20})/(\w{1,20}))$
Publicado 09/10/2008 em 14:48
fonte usuário
Em outras línguas...                            


6 respostas

votos
5

Ir a |, use o ?e()

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

E se você substituir o A1-C3 com um padrão:

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

Explicação:

  • que corresponde a cada cadeia que começa com http://www.example.com/A1
  • ele pode combinar um adicional /B2e até mesmo um adicional /C3, mas /C3só é igualada, quando há uma/B2
  • [^/]* (como muitas barras não possível)
  • se você precisar do A1-C3 em grupos de captura especiais, você pode usar isto:

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

Vai dar ( groupnumber: content):

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

Você pode verificá-la on-line aqui ou obter essa ferramenta (sim, é livre, e é ainda escrito em Lisp ...).

Respondeu 09/10/2008 em 15:02
fonte usuário

votos
3

Há um muito mais Django maneira de fazer isso:

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"),
)

Os outros métodos não tirar proveito do poder de Django passar variáveis.

Editar: Eu trocou a ordem do URLPATTERN a ser mais evidente para o analisador (ou seja, de baixo para cima é mais definido do que cima para baixo).

Respondeu 22/07/2009 em 20:52
fonte usuário

votos
1

Esteja ciente de que o Django correspondência de URL reversa (permalinks, reverse()e {% url %}) pode lidar com um subconjunto limitado de expressões regulares. Para ser capaz de usá-los, às vezes é necessário dividir expressões regulares complexas em regras URL expedidor separadas.

Respondeu 15/10/2008 em 20:39
fonte usuário

votos
1

Se eu estou entendendo, eu acho que você só precisa de um outro conjunto de parênteses em torno do todo ou declaração:

^((\w{1,20})|((\w{1,20})/(\w{1,20}))|((\w{1,20})/(\w{1,20})/(\w{1,20})))$
Respondeu 09/10/2008 em 15:04
fonte usuário

votos
1
 ^(\w{1,20})(/\w{1,20})*

isto é para o maior número de subdiretórios que quiser se só deseja 2:

 ^(\w{1,20})(/\w{1,20}){0,2}
Respondeu 09/10/2008 em 15:03
fonte usuário

votos
1
http://www\.example\.com/A1(/B2(/C3)?)?
Respondeu 09/10/2008 em 15:01
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more