2012-02-13 5 views
15

मैं एक नियमित अभिव्यक्ति लिखने की कोशिश कर रहा हूं जो एक मार्कडाउन-शैली लिंक को प्रतिस्थापित करता है लेकिन ऐसा लगता है कि यह काम नहीं कर रहा है।regex का उपयोग कर मार्कडाउन-स्टाइल लिंक को कैसे परिवर्तित करें?

# ruby code: 
text = "[link me up](http://www.example.com)" 
text.gsub!(%r{\[(\+)\]\((\+)\)}x, %{<a target="_blank" href="\\1">\\2</a>}) 

क्या मैं गलत कर रहा हूँ: यह क्या मैं अब तक किया है?

def linkup(str) 
    str.gsub %r{ 
    \[   # Literal opening bracket 
     (  # Capture what we find in here 
     [^\]]+ # One or more characters other than close bracket 
    )  # Stop capturing 
    \]   # Literal closing bracket 
    \(  # Literal opening parenthesis 
     (  # Capture what we find in here 
     [^)]+ # One or more characters other than close parenthesis 
    )  # Stop capturing 
    \)   # Literal closing parenthesis 
    }x, '<a href="\2">\1</a>' 
end 

text = "[link me up](http://www.example.com)" 
puts linkup(text) 
#=> <a href="http://www.example.com">link me up</a> 

ध्यान दें कि उपर्युक्त URL कि अधिकार है के लिए असफल हो जायेगी:

+0

(जैसे अद्भुत [kramdown] http एक पूर्ण रूबी Markdown पुस्तकालय का उपयोग क्यों नहीं, : //kramdown.rubyforge.org/)? – Phrogz

+0

क्योंकि मुझे केवल मार्कडाउन सुविधाओं के सीमित सबसेट की आवश्यकता है और मुझे एक लाइब्रेरी नहीं मिली है जो मुझे यह निर्दिष्ट करने की अनुमति देती है कि मैं कौन सी विशेषताओं का समर्थन करना चाहता हूं (इसलिए मुझे अपना खुद का लिखना है)। – Andrew

उत्तर

36
irb(main):001:0> text = "[link me up](http://www.example.com)" 
irb(main):002:0> text.gsub /\[([^\]]+)\]\(([^)]+)\)/, '<a href="\2">\1</a>' 
#=> "<a href=\"http://www.example.com\">link me up</a>" 

हम इसे एक बिल्ली की तरह नहीं लग रही बनाने के लिए रूबी के regex के लिए ई x जाती थी विकल्प का उपयोग कर सकते हैं कीबोर्ड पर कूद गया उनमें संश्लेषण, उदाहरण के लिए

linkup "[O](http://msdn.microsoft.com/en-us/library/ms533050(v=vs.85).aspx)" 
# <a href="http://msdn.microsoft.com/en-us/library/ms533050(v=vs.85">O</a>.aspx) 

यदि यह आप के लिए महत्वपूर्ण है, तो आप की जगह [^)]+ साथ \S+(?=\)) जो का अर्थ है "आप कर सकते हैं के रूप में कई गैर-सफ़ेद-पात्रों पाते हैं, लेकिन यह सुनिश्चित है कि वहाँ एक ) बाद में"


अपने प्रश्न का उत्तर देने "क्या मैं गलत कर रहा हूँ", यहाँ क्या अपने रेगुलर एक्सप्रेशन से कहा है:

%r{ 
    \[  # Literal opening bracket (good) 
    ( # Start capturing   (good) 
     \+ # A literal plus character (OOPS) 
    )  # Stop capturing   (good) 
    \]  # Literal closing bracket (good) 
    \(  # Literal opening paren  (good) 
    ( # Start capturing   (good) 
     \+ # A literal plus character (OOPS) 
    )  # Stop capturing   (good) 
    \)  # Literal closing paren  (good) 
}x 
+0

महान स्पष्टीकरण। धन्यवाद! – Andrew

+1

भी, मैंने कभी भी ब्रांड्स के साथ एक यूआरएल नहीं देखा है। मैंने यह भी नहीं सोचा कि यह मान्य था। – Andrew

+0

बहुत बढ़िया स्पष्टीकरण इंगित करने के लिए धन्यवाद। यदि संभव हो तो +1 से अधिक दिया होगा। मैं आपकी सलाह का उपयोग कर [[foobar]] वाक्यविन्यास के लिए एक matcher कर समाप्त हो गया। यहां मेरा जाना है (आपके से सरलीकृत):/\\ [\\ [([^ \\]] +) \\] \\] /। –

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