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]


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


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

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.


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.


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: \\[^\\]+$


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:([^\/]+)$


2

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

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

[Regex Demo]

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.