Regex Ostatnie wystąpienie?

122

Próbuję złapać ostatnią część po ostatnim odwrotnym ukośniku
Potrzebuję \Web_ERP_Assistant(z \)

Mój pomysł był:

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


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

Ale nie mogę tego znaleźć.

[Regexer Demo]

Royi Namir
źródło
2
Doceniam, że Twoje pytanie dotyczyło wyrażeń regularnych, ale czy na pewno jest to najlepsze narzędzie do wykorzystania w tym miejscu? Większość bibliotek standardowych będzie miała metodę, która pobierze ostatnią nazwę ścieżki w danym katalogu. Uwzględnia to również, czym jest separator katalogów w danym systemie operacyjnym.
Steve Rukuts
@Raskolnikov Potrzebuję tego w wyrażeniu regularnym. Znam Pth.getFileNameWithoutExtension. Pytanie jest oznaczone jako wyrażenie regularne
Royi Namir
2
OK, w porządku, tylko się upewniam. W takim razie zostawię to ludziom, którzy są bardziej biegli w wyrażeniach regularnych.
Steve Rukuts

Odpowiedzi:

95

Twoje negatywne rozwiązanie lookahead wyglądałoby na przykład tak:

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

Zobacz to tutaj na Regexr

stema
źródło
2
Jest (?:to początek grupy bez przechwytywania. To .jest dowolny znak, sprawdza każdy znak, jeśli nie występuje po nim znak ``.
stema
Linia Multi służy tylko do potrzebnego testu Regexr. Zmienia znaczenie $. Standard to koniec ciągu, a Multiline to koniec wiersza. Ponieważ tekst testowy w Regexr ma wiele wierszy, potrzebuję tam tej opcji.
stema
co zrobić, jeśli chcę uzyskać to samo pytanie, co moje oryginalne pytanie, ale bez \ na początku?
Royi Namir
2
(?:[^\\/](?!(\\|/)))+$usuwa ukośnik na początku i radzi sobie z ukośnikami do przodu i do tyłu. Dopasowuje również cały ciąg znaków bez ukośników, np. Manual.doc
mrswadge
5
W hartowanego Greedy token kropka powinna zawsze przychodzą po uprzedzona: (?:(?!\\).)+. ( ref ) Również twój przykład w RegExr używa dwóch odwrotnych ukośników do oddzielenia składników ścieżki; powinien być tylko jeden, a wyrażenie regularne powinno pasować tylko do jednego. ( demo )
Alan Moore,
62

Jeden, który działał dla mnie, to:

.+(\\.+)$

Wypróbuj online!

Wyjaśnienie:

.+     - 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
źródło
16
Dzięki za rozbicie części :)
Jason Bruce
1
W szczególności szukałem wyrażenia regularnego, które pasuje do ostatniego ukośnika (/). Okazuje się, że zaakceptowana powyżej odpowiedź @stema spełnia swoje zadanie, gdy lewy ukośnik jest zastępowany ukośnikiem. Twój pasuje do wszystkiego po KAŻDYM ukośniku, co tak naprawdę nie jest poszukiwanym rozwiązaniem. Głosowałem za twoją odpowiedzią, ponieważ twoje wyjaśnienie było trafne, chociaż twoje rozwiązanie tak naprawdę nie
zadziałało
Jest to o wiele prostsze i ogólnie lepsze niż negatywne spojrzenie w przód, o ile jest nieprzerwane w linii, po co nadmiernie komplikować?
Scott Anderson
42

Negatywne spojrzenie w przyszłość jest poprawną odpowiedzią, ale można je zapisać jaśniej, na przykład:

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

To wyszukuje wystąpienie \, a następnie podczas sprawdzania, które nie jest dopasowane, szuka dowolnej liczby znaków, po których następuje znak, którego nie chcesz widzieć po nim. Ponieważ jest ujemny, pasuje tylko wtedy, gdy nie znajdzie dopasowania.

Czas
źródło
4
Dopasowuje ostatni backslash tylko . OP również chce dopasować wszystko po nim.
Alan Moore
Bardzo pomocne, ta czystsza wersja, chociaż przechwytująca tylko lewy ukośnik, sprawiła, że ​​wszystko kliknęło. Dziękuję Ci.
Matt Binford,
28

Możesz spróbować zakotwiczyć go na końcu sznurka, na przykład \\[^\\]*$. Chociaż nie jestem pewien, czy absolutnie trzeba użyć wyrażenia regularnego do tego zadania.

Michael Krelin - haker
źródło
2
To działało świetnie dla mnie. ([^\/]*)$pasuje do nazwy pliku w ścieżce do komputera z systemem Linux. Czy możesz wyjaśnić, jak ^działa daszek w tym kontekście? Użyłem go tylko do oznaczenia początku strun.
Brad,
@Brad, to negacja. Znaczenie [^\/]pasuje do dowolnego znaku oprócz /.
Michael Krelin - haker
9

A co z tym wyrażeniem regularnym: \\[^\\]+$

SERPRO
źródło
Cóż, nie sądzę, żeby to było w wyrażeniu regularnym. Ale
edytuję
err ... Nie sądzę, żeby to w ogóle mogło być wyrażenie regularne, ale z pewnością, aby dopasowanie je obejmowało, powinno być. Nie to ma znaczenia. Właśnie pomyślałem, co może być nie tak w Twojej odpowiedzi po jej zobaczeniu został odrzucony i to właśnie wymyśliłem, więc skomentowałem.
Michael Krelin - haker
@michael, nie zrozum mnie źle Doceniam twój komentarz, po prostu pomyślałem, że nie ma potrzeby dodawania go do wyrażenia regularnego \;)
SERPRO
5

Jeśli nie chcesz dołączać odwrotnego ukośnika, ale tylko tekst po nim, spróbuj tego: ([^\\]+)$lub dla unix:([^\/]+)$

Katja
źródło
2

Użyłem poniżej wyrażenia regularnego, aby uzyskać ten wynik również wtedy, gdy jest zakończony rozszerzeniem \

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

[Regex Demo]

shA.t
źródło