Регулярное выражение — положительный просмотр назад

У меня есть несколько файлов с парой миллионов строк с чем-то вроде следующего:

9/9/2015 2:50:39 PM: Export for https://portal.gaf.com/sites/RCNHistory/Lists/RCNs/Attachments/148/Ruberoid HW Plus SV.xls Complete.
9/9/2015 2:50:39 PM: Export for https://portal.gaf.com/sites/RCNHistory/Lists/RCNs/Attachments/148/Ruberoid Mop Granule SV.xls Complete.
9/9/2015 2:50:40 PM: Export for https://portal.gaf.com/sites/RCNHistory/Lists/RCNs/Attachments/148/Ruberoid Mop Smooth 1.5 SV.xls Complete.

Я надеялся зафиксировать имя файла в каждой строке со следующим:

$(?<=\/) Конечно, мне придется удалить "Завершить". но я думаю, я начинаю медленно

но я не освоил искусство регулярного выражения. может ли кто-нибудь сообщить мне, что я делаю неправильно?

Спасибо.


person user68650    schedule 11.09.2015    source источник
comment
Какой язык или инструмент вы используете?   -  person Casimir et Hippolyte    schedule 11.09.2015


Ответы (4)


Это может сработать — вы получите имя файла из группы захвата:

\/([^\/]*) Complete.$

Вот пример регулярного выражения: http://www.regexr.com/3bp2l

person Shawn Erquhart    schedule 11.09.2015

Вам не нужно усложнять ситуацию с ретроспективным просмотром, если все строки имеют этот формат. Вы можете просто использовать жадное сопоставление, чтобы получить то, что вы хотите.

.*\/(.*) Complete.

Что по сути:

Сопоставьте все (включая /) до /, за которым следует некоторый текст (в данном случае ваше имя файла), за которым следует буквальное «Complete».

Соответствующая группа содержит имя файла.

Итак, для поиска и замены регулярных выражений в N++ вы должны использовать:

Находить

.*\/(.*) Complete.

Заменять

$1

Это оставит вас только с именем файла в каждой строке.

person BunjiquoBianco    schedule 15.09.2015

Lookbehind — это утверждение нулевой ширины в позиции. Это не способ указать регулярному выражению, с чего начинать — оно всегда должно начинаться с самого начала. Вероятно, вы могли бы использовать регулярное выражение, например .*/(.*) Complete, чтобы зафиксировать это.

Если вы работаете с оболочкой, инструмент cut отлично подходит и для этого.

# get everything after the last slash and before the last space (` Complete`)
rev $INPUT_FILE | cut -d'/' -f 1 | cut -d' ' -f2- | rev
person Explosion Pills    schedule 11.09.2015

Вы можете использовать это регулярное выражение с просмотром назад:

/(?<=\/)[^\/]+$/

Обязательно используйте режим MULTILINE.

Демо RegEx

person anubhava    schedule 11.09.2015