Regex Última ocorrência?

122

Estou tentando pegar a última parte após a última barra invertida
, preciso do \Web_ERP_Assistant(com \)

Minha ideia era:

C:\Projects\Ensure_Solution\Assistance\App_WebReferences\Web_ERP_WebService\Web_ERP_Assistant


\\.+?(?!\\)      //  I know there is something with negative look -ahead `(?!\\)`

Mas não consigo encontrar.

[Regexer Demo]

Royi Namir
fonte
2
Agradeço que sua pergunta se refira a regexes, mas tem certeza de que essa é a melhor ferramenta para usar aqui? A maioria das bibliotecas padrão terá um método que recuperará o último nome do caminho em um determinado diretório. Isso também leva em consideração qual é o separador de diretório em um determinado sistema operacional.
Steve Rukuts
@Raskolnikov Eu preciso disso no regex. Eu conheço o Pth.getFileNameWithoutExtension. O QUestion foi marcado como regex
Royi Namir
2
OK, justo, apenas tendo certeza. Vou deixar isso para pessoas mais habilidosas em regexes.
Steve Rukuts

Respostas:

95

Sua solução de lookahead negativo seria, por exemplo:

\\(?:.(?!\\))+$

Veja aqui no Regexr

estema
fonte
2
O (?:é o início de um grupo sem captura. O .é qualquer caractere, isso verifica qualquer caractere se não for seguido por um ``.
stema
A linha Multi é apenas para o teste Regexr necessário. Ele muda o significado do $. Padrão é o fim da string, com Multiline como o fim da linha. Como o texto de teste no Regexr tem várias linhas, preciso dessa opção aqui.
stema
e se eu quiser o mesmo requisito da minha pergunta original, mas sem o \ no início?
Royi Namir
2
(?:[^\\/](?!(\\|/)))+$remove a barra no início e lida com barras anteriores e posteriores. Ele também corresponde a toda a string para pathes sem nenhuma barra,
mrswadge
5
Em um token Greedy temperado, o ponto deve sempre vir depois do lookahead: (?:(?!\\).)+. ( ref ) Além disso, seu exemplo no RegExr usa duas barras invertidas para separar os componentes do caminho; deve haver apenas um e o regex deve corresponder a apenas um. ( demonstração )
Alan Moore
62

Um que funcionou para mim foi:

.+(\\.+)$

Experimente online!

Explicação:

.+     - any character except newline
(      - create a group
 \\.+   - match a backslash, and any characters after it
)      - end group
$      - this all has to happen at the end of the string
Jeeter
fonte
15
Obrigado pela divisão das partes :)
Jason Bruce
1
Eu estava procurando especificamente por um regex que corresponda à última barra (/). Acontece que a resposta aceita acima por @stema faz o trabalho quando a barra invertida é substituída por uma barra normal. O seu corresponde a tudo após CADA barra, o que realmente não é a solução buscada. Votei positivamente em sua resposta porque sua explicação foi sucinta, embora sua solução não tenha realmente funcionado
Chidozie Nnachor
Isso é muito mais simples e geralmente melhor do que um lookahead negativo, contanto que seja ininterrupto em uma linha, por que complicar demais?
Scott Anderson
42

Uma análise negativa à frente é uma resposta correta, mas pode ser escrita de forma mais clara como:

(\\)(?!.*\\)

Isto procura por uma ocorrência de \ e então em uma verificação que não é correspondida, procura por qualquer número de caracteres seguidos pelo caractere que você não deseja ver depois dele. Por ser negativo, só corresponde se não encontrar uma correspondência.

Tempo
fonte
4
Corresponde apenas à última barra invertida . O OP também deseja combinar tudo depois dele.
Alan Moore
Muito útil, esta versão mais limpa, embora capturasse apenas a barra invertida, fazia tudo clicar. Obrigado.
Matt Binford
28

Você pode tentar ancorá-lo no final da corda, algo assim \\[^\\]*$. Embora eu não tenha certeza se é absolutamente necessário usar regexp para a tarefa.

Michael Krelin - hacker
fonte
2
Isso funcionou muito bem para mim. ([^\/]*)$corresponde ao nome do arquivo em um caminho para uma caixa Linux. Você pode explicar como o cursor ^funciona neste contexto? Eu só usei isso para significar o início das cordas.
Brad
@Brad, é negação. O significado [^\/]corresponde a qualquer caractere, exceto para /.
Michael Krelin - hacker de
9

E sobre este regex: \\[^\\]+$

SERPRO
fonte
Bem, eu não acho que isso precisa estar no regex. Mas vou editar minha resposta
SERPRO
err ... Não acho que deva ser regex, mas certamente, para a correspondência incluí-la, ela deveria estar. Não que isso importe, acabei de pensar no que pode estar errado em sua resposta depois de vê-la foi rejeitado e foi isso que eu fiz, então comentei.
Michael Krelin - hacker
@michael, não me interprete mal Agradeço seu comentário, só achei que não seria necessário adicioná-lo na regex o \;)
SERPRO
5

Se você não quiser incluir a barra invertida, mas apenas o texto depois dela, tente o seguinte: ([^\\]+)$ou para unix:([^\/]+)$

Katja
fonte
2

Usei o regex abaixo para obter esse resultado também quando foi concluído por um \

(\\[^\\]+)\\?$

[Regex Demo]

shA.t
fonte