Regex Dernière occurrence?

122

J'essaye d'attraper la dernière partie après la dernière barre oblique inverse,
j'ai besoin du \Web_ERP_Assistant(avec le \)

Mon idée était:

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


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

Mais je ne peux pas le trouver.

[Regexer Demo]

Royi Namir
la source
2
J'apprécie que votre question porte sur les expressions régulières, mais êtes-vous sûr que c'est le meilleur outil à utiliser ici? La plupart des bibliothèques standard auront une méthode qui récupérera le dernier nom de chemin dans un répertoire donné. Cela prend également en compte ce qu'est le séparateur de répertoire sur un système d'exploitation donné.
Steve Rukuts
@Raskolnikov J'en ai besoin dans regex. Je connais le Pth.getFileNameWithoutExtension. La question est taguée comme regex
Royi Namir
2
OK, assez juste, juste en s'assurant. Je laisserai alors le soin à des personnes plus expérimentées dans les regex.
Steve Rukuts

Réponses:

95

Votre solution de recherche négative serait par exemple la suivante:

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

Voir ici sur Regexr

stema
la source
2
Le (?:est le début d'un groupe non capturant. Le .est n'importe quel caractère, ceci vérifie n'importe quel caractère s'il n'est pas suivi d'un ``.
stema
La ligne Multi est uniquement pour le test Regexr nécessaire. Cela change la signification du $. Standard est la fin de la chaîne, avec Multiline sa fin de la ligne. Parce que le texte de test dans Regexr a plusieurs lignes, j'ai besoin de cette option.
stema
et si je veux la même demande que ma question initiale, mais sans le \ au début?
Royi Namir
2
(?:[^\\/](?!(\\|/)))+$supprime la barre oblique au début et fait face aux barres obliques avant et arrière. Il correspond également à la chaîne entière pour les chemins sans aucune barre oblique,
mrswadge
5
Dans un jeton Greedy, le point Trempé doit toujours venir après la préanalyse: (?:(?!\\).)+. ( ref ) De plus, votre exemple sur RegExr utilise deux antislashs pour séparer les composants du chemin; il ne devrait y en avoir qu'un, et l'expression régulière ne devrait correspondre qu'à une seule. ( démo )
Alan Moore
62

Celui qui a fonctionné pour moi était:

.+(\\.+)$

Essayez-le en ligne!

Explication:

.+     - 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
la source
16
Merci pour la ventilation des parties :)
Jason Bruce
1
Je cherchais spécifiquement un regex qui correspond à la dernière barre oblique (/). Il s'avère que la réponse acceptée ci-dessus par @stema fait le travail lorsque la barre oblique inverse est remplacée par une barre oblique. Le vôtre correspond à tout après CHAQUE barre oblique, ce qui n'est vraiment pas la solution recherchée. J'ai voté pour votre réponse parce que votre explication était succincte, même si votre solution n'a pas vraiment fait le travail
Chidozie Nnachor
C'est tellement plus simple et généralement meilleur qu'une anticipation négative, tant qu'elle est ininterrompue sur une ligne, pourquoi trop compliquer?
Scott Anderson le
42

Un regard négatif sur l'avenir est une bonne réponse, mais cela peut être écrit plus proprement comme:

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

Cela recherche une occurrence de \, puis dans une vérification qui ne correspond pas, il recherche un nombre quelconque de caractères suivi du caractère que vous ne voulez pas voir après. Parce qu'il est négatif, il ne correspond que s'il ne trouve pas de correspondance.

Temps
la source
4
Cela correspond uniquement à la dernière barre oblique inverse . L'OP veut faire correspondre tout après lui aussi.
Alan Moore
Très utile, cette version plus propre, bien que ne capturant que la barre oblique inverse, a tout fait cliquer. Je vous remercie.
Matt Binford
28

Vous pouvez essayer de l'ancrer à la fin de la chaîne, quelque chose comme \\[^\\]*$. Bien que je ne sois pas sûr qu'il faille absolument utiliser l'expression rationnelle pour la tâche.

Michael Krelin - hacker
la source
2
Cela a très bien fonctionné pour moi. ([^\/]*)$correspond au nom de fichier dans un chemin pour une boîte Linux. Pouvez-vous expliquer comment fonctionne le curseur ^dans ce contexte? Je ne l'ai jamais utilisé que pour signifier le début des cordes.
Brad
@Brad, c'est de la négation. La signification [^\/]correspond à n'importe quel caractère sauf pour /.
Michael Krelin - hacker
9

Et cette regex: \\[^\\]+$

SERPRO
la source
Eh bien, je ne pense pas que cela doive être dans la regex. Mais je vais modifier ma réponse
SERPRO
euh ... je ne pense pas que ça devrait être une expression régulière du tout, mais certainement pour que match l'inclue, ça devrait l'être. Pas que ça compte, j'ai juste pensé à ce qui pourrait être faux dans ta réponse après l'avoir vue a été contre-voté et c'est ce que j'ai proposé, alors j'ai commenté.
Michael Krelin - hacker
@michael, ne vous méprenez pas, j'apprécie votre commentaire, je pensais juste qu'il n'était pas nécessaire de l'ajouter sur le regex the \;)
SERPRO
5

Si vous ne voulez pas inclure la barre oblique inverse, mais seulement le texte après, essayez ceci: ([^\\]+)$ou pour unix:([^\/]+)$

Katja
la source
2

J'ai utilisé ci-dessous regex pour obtenir ce résultat également quand il est terminé par un \

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

[Regex Demo]

shA.t
la source