Regex Последнее вхождение?


123

Я пытаюсь поймать последнюю часть после последней обратной косой черты,
мне нужен \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
Я понимаю, что ваш вопрос относится к регулярным выражениям, но уверены ли вы, что это лучший инструмент для использования здесь? В большинстве стандартных библиотек есть метод, который будет извлекать последнее имя пути в заданном каталоге. Это также учитывает разделитель каталогов в данной ОС.
Стив Рукутс,

@ Раскольников Мне это нужно в регулярном выражении. Я знаю Pth.getFileNameWithoutExtension. Вопрос помечен как регулярное выражение
Рой Намир

2
Хорошо, достаточно честно, просто убедившись. Тогда я оставлю это людям, более опытным в регулярных выражениях.
Стив Рукутс,

Ответы:


95

Например, ваше решение с отрицательным прогнозом будет следующим:

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

Смотрите здесь, на Regexr


2
Это (?:начало группы без захвата. Это .любой символ, проверяется любой символ, если за ним не стоит ``.
stema

Строка Multi предназначена только для необходимого теста Regexr. Это меняет значение $. Стандарт - это конец строки, а многострочный - конец строки. Поскольку тестовый текст в Regexr состоит из нескольких строк, мне нужна эта опция.
stema

что, если я хочу получить тот же запрос, что и мой исходный вопрос, но без \ в начале?
Royi Namir 07

2
(?:[^\\/](?!(\\|/)))+$удаляет косую черту в начале и справляется как с прямой, так и с обратной косой чертой. Он также соответствует всей строке для путей без косой черты, например manual.doc
mrswadge

5
В закаленном жадном Токене, точка всегда должна прийти после опережающего просмотра: (?:(?!\\).)+. ( ref ) Кроме того, в вашем примере с RegExr для разделения компонентов пути используются две обратные косые черты; должен быть только один, а регулярное выражение должно соответствовать только одному. ( демо )
Алан Мур

64

У меня сработало следующее:

.+(\\.+)$

Попробуйте онлайн!

Объяснение:

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

17
Спасибо за
Джейсон Брюс

1
Я специально искал регулярное выражение, которое соответствует последней косой черте (/). Оказывается, принятый выше ответ @stema выполняет свою работу, когда обратная косая черта заменяется косой чертой. Ваш соответствует всему, что следует за КАЖДОЙ косой чертой, что на самом деле не является искомым решением. Я поддержал ваш ответ, потому что ваше объяснение было кратким, хотя ваше решение на самом деле не
помогло

Это намного проще и, как правило, лучше, чем отрицательный просмотр вперед, если он не прерывается в строке, зачем усложнять?
Скотт Андерсон,

42

Отрицательный взгляд в будущее - правильный ответ, но его можно записать более четко, например:

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

Это ищет вхождение \, а затем при проверке, которая не сопоставляется, ищет любое количество символов, за которыми следует символ, который вы не хотите видеть после него. Поскольку он отрицательный, он соответствует только в том случае, если он не находит совпадения.


4
Соответствует только последней обратной косой черте . OP тоже хочет сопоставить все после него.
Алан Мур

Очень полезная, более чистая версия, хотя и фиксирует только обратную косую черту, заставляет все щелкать. Спасибо.
Мэтт Бинфорд

28

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


2
Это отлично сработало для меня. ([^\/]*)$совпадает с именем файла в пути к ящику Linux. Вы можете объяснить, как ^в этом контексте работает каретка ? Я когда-либо использовал его только для обозначения начала струн.
Brad

@ Брэд, это отрицание. Значение [^\/]соответствует любому символу, кроме /.
Майкл Крелин - хакер,

9

Что насчет этого регулярного выражения: \\[^\\]+$


Ну, я не думаю, что это должно быть в регулярном выражении. Но я отредактирую свой ответ
SERPRO

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

@michael, не поймите меня неправильно, я ценю ваш комментарий, я просто подумал, что нет необходимости добавлять его в регулярное выражение \;)
SERPRO

5

Если вы не хотите включать обратную косую черту, а только текст после нее, попробуйте следующее: ([^\\]+)$или для unix:([^\/]+)$


2

Я использовал ниже регулярное выражение, чтобы получить этот результат также, когда он закончился \

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

[Regex Demo]

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.