Regex Ultima occorrenza?


122

Sto cercando di catturare l'ultima parte dopo l'ultima barra rovesciata
ho bisogno del \Web_ERP_Assistant(con il \)

La mia idea era:

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


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

Ma non riesco a trovarlo.

[Regexer Demo]


2
Apprezzo che la tua domanda riguardasse le espressioni regolari, ma sei sicuro che questo sia lo strumento migliore da usare qui? La maggior parte delle librerie standard avrà un metodo che recupererà l'ultimo nome di percorso in una determinata directory. Questo tiene anche conto di quale sia il separatore di directory su un determinato sistema operativo.
Steve Rukuts

@ Raskolnikov ne ho bisogno in regex. Conosco Pth.getFileNameWithoutExtension. La domanda è contrassegnata come regex
Royi Namir

2
OK, abbastanza giusto, solo assicurandomi. Lo lascerò a persone più esperte in regex allora.
Steve Rukuts

Risposte:


95

La tua soluzione lookahead negativa sarebbe ad esempio questa:

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

Guardalo qui in RegExr


2
Il (?:è l'inizio di un gruppo non cattura. Il .è un qualsiasi carattere, questo controlla ogni carattere, se non è seguita da una ``.
stema

La linea Multi è solo per il test Regexr necessario. Cambia il significato di $. Standard è la fine della stringa, con Multiline la sua fine della riga. Poiché il testo di prova in Regexr ha più righe, ho bisogno di questa opzione lì.
stema

e se volessi la stessa richiesta della mia domanda originale, ma senza \ all'inizio?
Royi Namir

2
(?:[^\\/](?!(\\|/)))+$rimuove il taglio all'inizio e affronta sia i tagli in avanti che quelli posteriori. Corrisponde
mrswadge

5
In un avido Token temperato, il punto deve sempre venire dopo il lookahead: (?:(?!\\).)+. ( ref ) Inoltre, il tuo esempio su RegExr utilizza due barre rovesciate per separare i componenti del percorso; dovrebbe essercene solo uno e la regex dovrebbe corrispondere solo a uno. ( demo )
Alan Moore

62

Uno che ha funzionato per me è stato:

.+(\\.+)$

Provalo online!

Spiegazione:

.+     - 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

16
Grazie per la ripartizione delle parti :)
Jason Bruce

1
Stavo cercando specificamente una regex che corrispondesse all'ultima barra in avanti (/). Si scopre che la risposta accettata sopra da @stema fa il lavoro quando la barra rovesciata viene sostituita con una barra in avanti. Il tuo corrisponde a tutto ciò che segue OGNI barra, che in realtà non è la soluzione cercata. Ho votato contro la tua risposta perché la tua spiegazione era succinta, anche se la tua soluzione non ha funzionato davvero
Chidozie Nnachor

Questo è molto più semplice e generalmente migliore di un lookahead negativo, fintanto che è ininterrotto su una linea, perché complicare eccessivamente?
Scott Anderson,

42

Uno sguardo negativo al futuro è una risposta corretta, ma può essere scritta in modo più pulito come:

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

Questo cerca l'occorrenza di \ e poi in un controllo che non viene trovato, cerca un numero qualsiasi di caratteri seguito dal carattere che non vuoi vedere dopo di esso. Poiché è negativo, corrisponde solo se non trova una corrispondenza.


4
Corrisponde solo all'ultima barra rovesciata . Anche l'OP vuole abbinare tutto quello che segue.
Alan Moore

Molto utile, questa versione più pulita, sebbene catturi solo il backslash, ha fatto clic su tutto. Grazie.
Matt Binford

28

Puoi provare ad ancorarlo alla fine della stringa, qualcosa di simile \\[^\\]*$. Anche se non sono sicuro che sia assolutamente necessario utilizzare regexp per l'attività.


2
Questo ha funzionato benissimo per me. ([^\/]*)$corrisponde al nome del file in un percorso per una macchina Linux. Puoi spiegare come funziona il cursore ^in questo contesto? L'ho usato solo per indicare l'inizio delle stringhe.
Brad

@ Brad, è negazione. Il significato [^\/]corrisponde a qualsiasi carattere ad eccezione di /.
Michael Krelin - hacker

9

Che dire di questa regex: \\[^\\]+$


Beh, non penso che debba essere nella regex. Ma modificherò la mia risposta
SERPRO

err ... Non penso che dovrebbe essere affatto una regex, ma certamente per includerla in match, dovrebbe esserci. Non che sia importante, ho solo pensato a cosa potrebbe esserci di sbagliato nella tua risposta dopo averla vista è stato downvoted e questo è ciò che mi è venuto in mente, quindi ho commentato.
Michael Krelin - hacker

@michael, non fraintendermi, apprezzo il tuo commento, ho solo pensato che non fosse necessario aggiungerlo alla regex \;)
SERPRO

5

Se non vuoi includere la barra rovesciata, ma solo il testo dopo di essa, prova questo: ([^\\]+)$o per unix:([^\/]+)$


2

Ho usato sotto la regex per ottenere quel risultato anche quando è finito da un \

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

[Regex Demo]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.