Regex Letztes Vorkommen?

120

Ich versuche den letzten Teil nach dem letzten Backslash zu fangen, den
ich brauche \Web_ERP_Assistant(mit dem \)

Meine Idee war:

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


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

Aber ich kann es nicht finden.

[Regexer Demo]

Royi Namir
quelle
2
Ich weiß zu schätzen, dass sich Ihre Frage auf Regexes bezog, aber sind Sie sicher, dass dies das beste Werkzeug ist, das Sie hier verwenden können? Die meisten Standardbibliotheken verfügen über eine Methode, mit der der letzte Pfadname in einem bestimmten Verzeichnis abgerufen wird. Dies berücksichtigt auch, was das Verzeichnistrennzeichen auf einem bestimmten Betriebssystem ist.
Steve Rukuts
@Raskolnikov Ich brauche das in Regex. Ich kenne die Pth.getFileNameWithoutExtension. Die Frage ist als Regex
Royi Namir
2
OK, fair genug, nur um sicher zu gehen. Ich überlasse es dann Leuten, die sich mit Regexen auskennen.
Steve Rukuts

Antworten:

94

Ihre negative Lookahead-Lösung wäre z. B.:

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

Sehen Sie es hier auf Regexr

Stema
quelle
2
Dies (?:ist der Beginn einer nicht erfassenden Gruppe. Das .ist ein beliebiges Zeichen, dies überprüft jedes Zeichen, wenn es nicht von einem `` gefolgt wird.
Stema
Die Multi-Linie ist nur für den Regexr-Test erforderlich. Es ändert die Bedeutung des $. Standard ist das Ende der Zeichenfolge, Multiline das Ende der Zeile. Da der Testtext in Regexr mehrere Zeilen enthält, benötige ich diese Option dort.
Stema
Was ist, wenn ich die gleiche Anforderung wie meine ursprüngliche Frage haben möchte, aber ohne das \ am Anfang?
Royi Namir
2
(?:[^\\/](?!(\\|/)))+$Entfernt den Schrägstrich am Anfang und bewältigt sowohl Schrägstriche als auch Schrägstriche. Es stimmt auch mit der gesamten Zeichenfolge für Pfade ohne Schrägstriche überein,
mrswadge
5
In einem Tempered Greedy Token sollte der Punkt immer nach dem Lookahead stehen : (?:(?!\\).)+. ( ref ) Außerdem verwendet Ihr Beispiel in RegExr zwei Backslashes, um Pfadkomponenten zu trennen. es sollte nur eine, und die Regex sollte passen nur einen. ( Demo )
Alan Moore
62

Eine, die für mich funktioniert hat, war:

.+(\\.+)$

Probieren Sie es online aus!

Erläuterung:

.+     - 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
quelle
15
Vielen Dank für die Aufteilung der Teile :)
Jason Bruce
1
Ich habe speziell nach einem regulären Ausdruck gesucht, der zum letzten Schrägstrich (/) passt. Es stellt sich heraus, dass die oben von @stema akzeptierte Antwort den Job erledigt, wenn der umgekehrte Schrägstrich durch einen Schrägstrich ersetzt wird. Ihre passt zu allem nach JEDEM Schrägstrich, was wirklich nicht die gesuchte Lösung ist. Ich habe Ihre Antwort positiv bewertet, weil Ihre Erklärung kurz und bündig war, obwohl Ihre Lösung nicht wirklich funktioniert hat
Chidozie Nnachor,
Dies ist so viel einfacher und im Allgemeinen besser als ein negativer Lookahead, solange er in einer Zeile nicht unterbrochen wird. Warum überkomplizieren?
Scott Anderson
42

Ein negativer Blick nach vorne ist eine richtige Antwort, kann aber sauberer geschrieben werden als:

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

Dies sucht nach einem Vorkommen von \ und sucht dann bei einer Prüfung, die nicht übereinstimmt, nach einer beliebigen Anzahl von Zeichen, gefolgt von dem Zeichen, das Sie danach nicht sehen möchten. Da es negativ ist, stimmt es nur überein, wenn es keine Übereinstimmung findet.

Zeit
quelle
4
Dies entspricht den letzten Backslash nur . Das OP will auch danach alles zusammenbringen.
Alan Moore
Sehr hilfreich, diese sauberere Version hat zwar nur den Backslash erfasst, aber alles zum Klicken gebracht. Danke dir.
Matt Binford
27

Sie können versuchen, es am Ende der Zeichenfolge zu verankern \\[^\\]*$. Obwohl ich nicht sicher bin, ob man für die Aufgabe unbedingt Regexp verwenden muss.

Michael Krelin - Hacker
quelle
1
Das hat bei mir super funktioniert. ([^\/]*)$Entspricht dem Dateinamen in einem Pfad für eine Linux-Box. Können Sie erklären, wie das Caret ^in diesem Zusammenhang funktioniert? Ich habe es immer nur verwendet, um den Beginn von Zeichenfolgen zu kennzeichnen.
Brad
@Brad, es ist Negation. Die Bedeutung [^\/]entspricht jedem Zeichen außer /.
Michael Krelin - Hacker
8

Was ist mit dieser Regex: \\[^\\]+$

SERPRO
quelle
Nun, ich denke nicht, dass das in der Regex sein muss. Aber ich werde meine Antwort bearbeiten
SERPRO
ähm ... Ich denke nicht, dass es überhaupt Regex sein sollte, aber sicher, damit das Match es enthält, sollte es in sein. Nicht, dass es wichtig ist, ich habe nur darüber nachgedacht, was an Ihrer Antwort falsch sein könnte, nachdem ich sie gesehen habe wurde herabgestimmt und das war es, was ich mir ausgedacht habe, also habe ich es kommentiert.
Michael Krelin - Hacker
@ Michael, versteh mich nicht falsch Ich schätze deinen Kommentar, ich dachte nur, es ist nicht notwendig, ihn auf der Regex the \;)
SERPRO
5

Wenn Sie nicht den Backslash, sondern nur den Text danach einfügen möchten, versuchen Sie Folgendes: ([^\\]+)$oder für Unix:([^\/]+)$

Katja
quelle
2

Ich habe unter Regex verwendet, um dieses Ergebnis auch dann zu erhalten, wenn es mit a beendet ist \

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

[Regex Demo]

shA.t.
quelle