Ignorando um sufixo opcional com um regex gananciosos
-
07-07-2019 - |
Pergunta
Estou efectuar a correspondência regex em .NET contra cordas que olhar como esta:
1;#Lists/General Discussion/Waffles Win 2;#Lists/General Discussion/Waffles Win/2_.000 3;#Lists/General Discussion/Waffles Win/3_.000
Eu preciso para coincidir com a parte de URL sem os números no final, de modo que fico com esta:
Lists/General Discussion/Waffles Win
Esta é a regex Eu estou tentando:
(?:\d+;#)(?<url>.+)(?:/\d+_.\d+)*
O problema é que o último grupo está sendo incluído como parte do jogo do grupo do meio. Eu também tentei sem o * no final, mas, em seguida, apenas a primeira seqüência acima jogos e não o resto.
Eu tenho a opção multi-linha habilitada. Alguma idéia?
Solução
Algumas alternativas diferentes:
@"^\d+;#([^/]+(?:/[^/]+)*?)(?:/\d+_\.\d+)?$"
Este partidas como alguns segmentos de caminho possível, seguido por uma última parte opcional, e o fim da linha.
@"^\d+;#([^/]+(?:/(?!\d+_\.\d+$)[^/]+)*)"
A partidas como muitos segmentos de caminho quanto possível, desde que ele não é a parte de dígitos no fim da linha.
@"^\d+;#(.*?)(?:/\d+_\.\d+)?$"
Este partidas como alguns caracteres possível, seguido por uma última parte opcional, e o fim da linha.
Outras dicas
Você poderia tentar
^(\d+;#)([^/]+(/[^\d][^/]*)*)
e obter o 2º grupo. O primeiro grupo coincide com o 1;#
; o segundo grupo é dividido na primeira parte ou a URL (supostos conter qualquer carácter diferente de /), então corresponde a qualquer número de grupos de /, seguido por um não-dígitos, seguidos por outra coisa senão /.
neste site , parece fazer o que quiser. Experimentá-lo com mais algumas amostras.