Соответствие регулярному выражению с группировкой в ​​emacs - PullRequest
1 голос
/ 08 июня 2009

Я пытаюсь сопоставить строку, а затем с помощью группировки создаю новую строку:

  (let ((url (browse-url-url-at-point)))
    (if (string-match "http://domain/\\([0-9]+\\)/\\([a-z]+\\)\.\\([0-9]+\\)" url)
  (setq filename (concat (match-string 1 url) "_" (match-string 2) "." (match-string 3) ".xml"))))

Когда я (печатаю URL) я получаю следующее

"http://domain/1234/action.1234567"

Когда я (печатаю имя файла) после успешного совпадения получаю следующее:

#("1234_ublish.eport s.xml" 0 5 nil 5 11 (face nxml-element-local-name-face fontified t) 11 12 nil 12 17 (face nxml-element-local-name-face fontified t) 17 18 (fontified t) 18 19 (face nxml-attribute-local-name-face fontified t) 19 23 nil)

Почему это происходит?

Ответы [ 3 ]

4 голосов
/ 08 июня 2009

Вы не включили необязательный строковый параметр для вашей второй и третьей строки соответствия. Согласно документации по строке совпадения «строка должна быть указана, если последний поиск выполнялся с помощью` string-match 'в строке. "

3 голосов
/ 08 июня 2009

Я нашел проблему.

Оказывается, что (сопоставление строк) должно принимать исходную строку в качестве аргумента, иначе он возвращает этот странный список, содержащий странные значения (не уверен, что это такое).

В любом случае, изменив код на этот:

 (let ((url (browse-url-url-at-point)))
    (if (string-match "http://domain/\\([0-9]+\\)/\\([a-z]+\\)\.\\([0-9]+\\)" url)
  (setq filename (concat (match-string 1 url) "_" (match-string 2 url) "." (match-string 3 url) ".xml"))))

Исправляет проблему

2 голосов
/ 08 июня 2009

Поскольку mamboking уже упомянул , строка документа match-string расскажет вам все о:

(match-string NUM &optional STRING)
 ⋮
STRING should be given if the last search was by `string-match' on STRING.

Если вы также проверите документацию string-match, вы увидите, что она предлагает использовать match-beginning и match-end для получения совпадений. Это встроенные функции в C.

(if (string-match "\\([a-z]\\)" "123 test string")
  (match-beginning 1)) ;; 4

Эти функции возвращают только позицию начала или конца сопоставленного текста, поэтому match-string также нужна исходная строка. При использовании search-forward или re-search-forward, match-beginning и match-end будут возвращать позиции в буфере, поэтому match-string может легко извлечь интересующие совпадения из содержимого буфера.

Возможно, вы также захотите взглянуть на match-string-no-properties, который ведет себя так же, как и match-string, ожидая, что он возвращает строку текста, совпадающую без свойств текста.

...