Регекс Останнє явище?


122

Я намагаюся зловити останню частину після останнього зворотного косого кута, який
мені потрібен\Web_ERP_Assistant\)

Моя ідея:

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


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

Але я не можу його знайти.

[Regexer Demo]


2
Я вдячний, що ваше запитання стосується виразів, але ви впевнені, що це найкращий інструмент для використання тут? Більшість стандартних бібліотек матимуть метод, який отримає прізвище останнього шляху в заданій директорії. Це також враховує те, що роздільник каталогів у даній ОС.
Стів Рукуць

@Raskolnikov Мені це потрібно в регексе. Я знаю Pth.getFileNameWithoutExtension. ПИТАННЯ позначено як regex
Royi Namir

2
Гаразд, досить ярмарок, просто переконуюсь. Я тоді залишу це людям, більш досвідченим у справах регексів.
Стів Рукуць

Відповіді:


95

Вашим негативним рішенням пошуку, наприклад, буде таке:

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

Дивіться це тут на Regexr


2
Це (?:початок групи, яка не захоплює. Символ " .будь-який", це перевіряє будь-який символ, якщо за ним не слідує ``.
стема

Лінія Multi призначена лише для тесту Regexr. Це змінює значення $. Стандартним є кінець рядка, а багаторядковий кінець рядка. Оскільки тестовий текст у Regexr має кілька рядків, мені потрібна ця опція там.
стема

що робити, якщо я хочу той самий reqeust, як і моє початкове запитання, але без \ на початку?
Рой Намір

2
(?:[^\\/](?!(\\|/)))+$знімає косу рису на початку і справляється як з передніми, так і ззаду нахилами. Він також відповідає всій рядку для патьоків, без косої
mrswadge

5
У загартованому жадібному токені, точка завжди повинна прийти після випереджаючого перегляду: (?:(?!\\).)+. ( ref ) Також ваш приклад на RegExr використовує два зворочих косої риски для розділення компонентів шляху; має бути лише один, а регулярний вираз повинен відповідати лише одному. ( демонстрація )
Алан Мур

62

Я працював на мене:

.+(\\.+)$

Спробуйте в Інтернеті!

Пояснення:

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

15
Дякую за розбиття деталей :)
Джейсон Брюс

1
Я спеціально шукав регулярний вираз, який відповідає останньому нахилі вперед (/). Виявляється, прийнята відповідь вище від @stema виконує завдання, коли зворотний косий рядок замінюється косою косою стрілкою. Ваш відповідає всім наступним кожнім косою рисою, що насправді не є шуканим рішенням. Я підтримав вашу відповідь, тому що ваше пояснення було успішним, хоча ваше рішення насправді не
справило справи

Це набагато простіше і, як правило, краще, ніж негативний пошук, доки він безперебійний в рядку, чому надскладний?
Скотт Андерсон

42

Негативний погляд вперед - правильна відповідь, але його можна записати більш чітко, як:

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

Це шукає виникнення \, а потім у чеку, який не відповідає, він шукає будь-яку кількість символів, за якими слідує символ, якого ви не хочете бачити після нього. Оскільки це негативно, він відповідає лише тому, що не знайде відповідності.


4
Це збігається з останнім зворотної косої межі тільки . ОП хоче також узгодити все після цього.
Алан Мур

Дуже корисна, ця чистіша версія, хоч і фіксувала лише зворотну косу рису, зробила все клацанням. Дякую.
Метт

28

Ви можете спробувати прив’язати його до кінця рядка, щось на кшталт \\[^\\]*$. Хоча я не впевнений, чи потрібно абсолютно використовувати regexp для виконання завдання.


2
Це спрацювало для мене чудово. ([^\/]*)$відповідає імені файлу в шляху до вікна Linux. Чи можете ви пояснити, як ^працює карета в цьому контексті? Я лише коли-небудь використовував це для позначення початку рядків.
Бред

@Brad, це заперечення. Значення [^\/]відповідає будь-якому символу, крім /.
Майкл Крелін - хакер

9

Що про цей регулярний вираз: \\[^\\]+$


Добре, я не думаю, що це повинно бути в регексе. Але я відредагую свою відповідь
SERPRO

Помилка ... Я не думаю, що це взагалі повинно бути регулярно виражене, але, безумовно, для відповідності, щоб його включити, воно повинно бути. Не те, що це важливо, я просто подумав, що може бути не так у вашій відповіді, побачивши його це було прихильне, і це те, що я придумав, тому я прокоментував.
Майкл Крелін - хакер

@michael, не зрозумій мене неправильно. Я ціную твій коментар, я просто подумав, що не потрібно додавати його в
регекс

5

Якщо ви не хочете включати зворотну косу рису, а лише текст після неї, спробуйте це: ([^\\]+)$або для unix:([^\/]+)$


2

Я використовував нижче регексу, щоб отримати цей результат також, коли його закінчено а \

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

[Regex Demo]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.