2009-06-08 7 views
1

Ich versuche, eine Zeichenfolge zu passen und dann eine neue Zeichenfolge erstellen verwenden Gruppierung:Matching regexp mit Gruppierung in Emacs

(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")))) 

Wenn ich (Print url) ich folgende

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

Wenn ich (Print Dateiname) nach einem erfolgreichen Spiel ich folgendes erhalten:

#("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) 

Warum ist das Happing?

Antwort

4

Sie haben den optionalen String-Parameter für Ihre zweite und dritte Match-Zeichenfolge nicht angegeben. Laut der Match-String-Dokumentation sollte "string" angegeben werden, wenn die letzte Suche nach "string-match" in der Zeichenfolge erfolgte. "

3

Ich habe das Problem gefunden.

Es stellt sich heraus, dass (string-match) muss die ursprüngliche Zeichenfolge als Argument zu nehmen, oder sonst gibt es diese komische Liste mit seltsamen Werten (nicht sicher, was diese sind).

Auf jeden Fall über den Code zu diesem Wechsel:

(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")))) 

behebt das Problem

2

Wie mamboking already mentioned erzählt der docstring von match-string Sie alles über:

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

Wenn Sie auch Überprüfen Sie string-match 's Dokumentation, Sie werden sehen, dass es empfiehlt, match-beginning undzu verwenden, um die Spiele zu erhalten. Diese sind integrierte Funktionen in C.

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

Diese Funktionen geben nur die Position von Anfang oder Ende des Textes abgestimmt, deshalb match-string die ursprüngliche Zeichenfolge muss, auch. Bei Verwendung von search-forward oder re-search-forward, match-beginning und match-end werden Pufferpositionen zurückgegeben, sodass match-string die interessanten Übereinstimmungen einfach aus dem Inhalt des Puffers substringieren kann.

Sie können auch einen Blick auf match-string-no-properties werfen, die sich genauso verhält wie match-string erwartet, dass sie eine Textzeichenfolge ohne Texteigenschaften zurückgibt.