2016-06-02 4 views
0

Я пытаюсь написать регулярное выражение, которое дает мне индекс пути до определенной папки, а например:Emacs экстракт регулярных выражений путь

"/1/2/projects/myproject/application_self_service/development_settings.py" 

Если вернуть индекс 5, так что я могу извлечь путь от строка с использованием (подстрока 0 5 строка)

Я стучал головой здесь, в самом деле:

(string-match-p (regexp-quote ".*\\project") "/1/2/projects/myproject/application_self_service/development_settings.py") 

Возврат ноль все время .... Что не так?

+0

В этом случае необходимо использовать 'regexp-quote'? Кроме того, почему вы используете две обратные косые черты перед словом «проект»? – lawlist

+0

Я избегаю обратной косой черты. Я не настоящий эксперт ELisp, поэтому не стесняйтесь отвечать альтернативным решением. – pedr0

+0

Я не видел обратную косую черту в строке '' /1/2/projects/myproject/application_self_service/development_settings.py «поэтому я спросил о вашем предполагаемом использовании. Если нет причин включать обратную косую черту, удалите ее. Аналогично, если в этом случае нет причин включать 'regexp-quote', удалите его. Рассмотрите возможность размещения тестовой строки в буфере '* scratch * ', а затем введите' M-x re-builder'. В буфере '* RE-Builder * 'введите между двойными кавычками (которые уже должны быть там)'. * Project', а затем немного поиграйте с ним и при необходимости отредактируйте регулярное выражение. – lawlist

ответ

1

Я думаю, что регулярное выражение вам нужно всего лишь "/projects". На пути вы предоставили,

(string-match-p 
"/projects" 
"/1/2/projects/myproject/application_self_service/development_settings.py") 

возвращает 4, и

(substring "/1/2/projects/myproject/application_self_service/development_settings.py" 0 4) 

возвращается "/1/2". (Кстати, обратите внимание, что у вас были аргументы substring в неправильном порядке.)


Наконец, некоторые комментарии о том, почему ваш оригинальный подход не работает:

  1. Первый off, regexp-quote принимает строку и создает регулярное выражение, соответствующее только этой строке (в соответствии с ее документацией, попробуйте C-h f regexp-quote). В этом случае ваш вызов string-match-p будет возвращать только не-ниль, если строка содержит ".*\projects" (включая период и звездочку) как литералную подстроку.

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

  3. Наконец, вы не хотите включать в себя ведущую ".*" в регулярном выражении, потому что, даже в случае матча string-match-p просто вернет 0, потому что начало матча будет всегда на старте строка.

Смежные вопросы