Correspondência de expressão regular sem caráter final
-
20-09-2019 - |
Pergunta
Estou tentando corresponder a quaisquer solicitações de um URL que não tenha um caractere de pasta (/) ou termine com uma extensão (.aspx). Eu posso ignorar os valores e fragmentos de tentativa de consulta na expressão regular por enquanto. Até agora eu tenho o seguinte.
^([\w-/]+)(?!\.aspx|/)$
No entanto, se eu executar essa expressão, ele selecionou o final / no grupo que não quero que ele faça. O objetivo é anexar .aspx aos URLs que não o especificam usando o ISAPI reescrever e encaminhar a solicitação para o mecanismo .NET.
O exemplo abaixo mostra todos os caracteres em uma partida atual em negrito
asd.aspx
isto
algo.aspx
esse teste/ (não quero o final /)
esse teste/ (não quero o final /)
esse teste
Este teste/that/teste
Alguém pode sugerir uma expressão que não selecionasse o final / se encontrado na expressão?
Solução
Experimente uma afirmação de aparência:
^([\w-/]+)(?<!/|\.aspx)$
Outras dicas
Mova / fora do grupo ():
^([\w-/]+)(?!\.aspx)/?$
Sua primeira frase não corresponde à sua expressão ou exemplos regulares.
Parece -me que você quer:
- Se a string terminar com
.aspx
Não processe mais. - Caso contrário, se a string terminar com
/
Remova essa barra. - Processe a string.
Talvez você esteja tentando fazer muito com uma expressão regular?
Por que não testar explicitamente sua extensão (.aspx) e, se você não tiver, detecte uma barra de terminal e remova -a antes do processamento extra da string?
Ou seja: tenho certeza de que é possível criar uma expressão regular, com aparência negativa, que fará 1 e 2, mas não seria mais claro fazê -lo explicitamente.
Você também pode querer testar mais alguns exemplos:
foo/bar/.aspx
foo/bar.aspx/
foo.aspx/bar
foo.aspx/bar/
Só para ter certeza de que você sabe o que está esperando como saída.
Remova o / do regex e adicione -o para fora e especifique que ele pode ter 0 ou 1 ocorrência.
^([ w-/]+) (?!. ASPX) (/) {0,1} $