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.