2011-06-18 10 views
6

उदाहरण के लिए मैं सभी पाठ कोष्ठक,(), UPCASE में बनाना चाहता हूं। यह सहभागी निम्न करने के लिए तुच्छ है:Emacs: मैं एक defis में एक lisp समारोह के साथ regexp कैसे बदल सकता हूँ?

M-x query-replace-regexp 
replace: "(\(.+?\))" 
with : "(\,(upcase \1))" 

इसके बजाय मैं एक defun जो कि क्या करेंगे लिखना चाहते हैं:

(defun upcs() 
    (interactive) 
    (goto-char 1) 
    (while (search-forward "(\\(.+?\\))" nil t) (replace-match "(\\,(upcase \\1))" t nil))) 

लेकिन यह काम नहीं करता! जबकि निम्न काम करता है (यह foo और bar parenthesized ग्रंथों के संलग्न कर देता है):

सभी की
(defun HOOK() 
    (interactive) 
    (goto-char 1) 
    (while (search-forward-regexp "(\\(.+?\\))" nil t) (replace-match "(foo \\1 bar)" t nil))) 

उत्तर

2

तो यह समस्या हल करता है।

(defun put-in-par (str) 
    (concat "(" str ")")) 

(defun upcs-luke() 
    (interactive) 
    (goto-char 1) 
     (while (search-forward-regexp "(\\([^\\)]+\\))" nil t) 
      (replace-match (put-in-par (upcase (match-string 1))) t nil))) 

सहायता के लिए बिलसी और ल्यूक गिरविन के लिए धन्यवाद।

+0

यदि आप 'put-in-par' को खत्म करना चाहते हैं, तो आप यह कर सकते हैं: (अपरकेस-ल्यूक() (इंटरैक्टिव) (गोटो-चार 1) (जबकि (खोज-आगे-regexp "(\\ ([^ \\)] + \\)) "nil t) (प्रतिस्थापन-मिलान (concat" ("(अपकेस (मिलान-स्ट्रिंग 1))") ") टी शून्य)) – zev

+0

इसके लिए 'प्रारूप' का भी उपयोग करना यह उद्देश्य अधिक जटिल मामलों में बेहतर और अधिक लचीला होगा। – ocodo

5

सबसे पहले, आप अपने पहले समारोह में search-forward उपयोग कर रहे हैं। यह एक नियमित अभिव्यक्ति के बजाय एक स्ट्रिंग अक्षर लेता है। आपको search-forward-regexp का उपयोग करना चाहिए, जैसा कि आप अपने दूसरे फ़ंक्शन में करते हैं।

दूसरे, जबकि इस कोड query-replace-regexp के लिए एक मूल्य की जगह के रूप में मान्य है, मुझे नहीं लगता कि आप इसे replace-match को पारित कर सकते हैं:

(\\,(upcase \\1))

आप search-forward-regexp द्वारा पाया मैच का मूल्य प्राप्त कर सकते हैं match-string फ़ंक्शन का उपयोग कर।

अंत में, मुझे यकीन नहीं है कि आपकी खोज नियमित अभिव्यक्ति सही है।

(defun upcs() 
    (interactive) 
    (goto-char 1) 
     (while (search-forward-regexp "(\\([^\\)]+\\))" nil t) 
      (replace-match (upcase (match-string 1)) t nil))) 
+0

धन्यवाद ल्यूक। यह वास्तव में मिलान-स्ट्रिंग un-braced छोड़ देता है। लेकिन स्ट्रिंग-मैच के लिए सही संपीड़न को जानना - एक डिफ्यून लिखना आसान है जो इसे ब्रेसिज़ में रखेगा। मैं इसे "आपके प्रश्न का उत्तर" के रूप में पोस्ट करूंगा। एक बार फिर धन्यवाद। – Adobe

+0

@ एडोब - आपका स्वागत है। –

6

ल्यूक के जवाब लगभग काम करता है, लेकिन काफी नहीं:

मैं आप इन पंक्तियों के साथ कुछ की जरूरत है। मूल पोस्टर चाहता था कि सभी पाठ जो कोष्ठक में संलग्न थे, ऊपरी मामले में परिवर्तित हो गए हों, जबकि ल्यूक का कोड कोड को ऊपरी मामले में परिवर्तित कर देता है और साथ ही साथ ब्रांड्स को हटा देता है। रेगेक्स में मामूली संशोधन सही समाधान प्रदान करता है:

(defun upcs() 
(interactive) 
(goto-char 1) 
    (while (search-forward-regexp "\\([^\\)]+\\)" nil t) 
     (replace-match (upcase (match-string 1)) t nil))) 
+0

धन्यवाद बिल। आप सही - ल्यूक के जवाब मिलान-स्ट्रिंग un-braced छोड़ देता है। आपका जवाब, हालांकि, बफर ऊपरी मामले के सभी पाठ बनाता है।मैंने एक सरल defun लिखा है - और यह ल्यूक के जवाब को तोड़ देता है। मैं अंतिम समाधान को "आपके प्रश्न का उत्तर" के रूप में रखूंगा। एक बार फिर धन्यवाद। – Adobe

+0

हां, मेरा कोड ब्रांड्स को बंद कर देता है। ओपी ने सही समाधान पोस्ट किया है क्योंकि मैं अपने जवाब को संपादित करने से परेशान नहीं होगा। –

0

यह बहुत उपयोगी था, धन्यवाद।

वेब पर अधिक उदाहरण डालने के हित में, मैं इस से चला गया:

(replace-regexp "\([\%\)\”\"]\..?\)[0-9]+" "\1") 

(जो काम नहीं किया है, लेकिन regexps कि इंटरैक्टिव मोड में काम किया है इस्तेमाल किया है)

इसके लिए:

(while (re-search-forward "\\([\\%\\\"\\”]\\)\\.?[0-9]+" nil t) 
    (replace-match (match-string 1) t nil)) 

मुझे आंतरिक उद्धरण चिह्न से पहले तीन बैकस्लैश की आवश्यकता थी।

संबंधित मुद्दे