2016-05-10 13 views
2

ich versuche, eine Super grundlegende Template-Sprache zu entwickeln, und ich habe ein Problem mit RegEx, ich versuche, diese zu konvertieren:Regex Kette Ersatz Ausgabe

# Tilte 
## Subtitle 
### Subsubtitle 
Lorem ipsum b(dolor) sit i(amet), consectetur u(adipisicing) elit 

dazu:

<h1>Title</h1> 
<h2>Subtilte</h2> 
<h3>Subsubtitle</h3> 
Lorem ipsum <strong>dolor</strong> sit <i>amet</i>, consectetur <u>adipisicing</u> elit 

aber ich bekomme diese:

<h1></h1> 
<h2>TEma 4</h2> 
<h3>Subtitle</h3> 
Lorem ipsum <strong>Subsubtitle</strong> sit i(amet), consectetur u(adipisicing) elit 

Hier ist mein Code:

input = ARGV[0] 

regExes = { 

    h1: [/^# (.*)$/, "<h1>", "</h1>"], 
    h2: [/^## (.*)$/, "<h2>", "</h2>"], 
    h3: [/^### (.*)$/, "<h3>", "</h3>"], 
    b: [/b\((.*)\)/, "<strong>", "</strong>"], 

} 

strFile = File.read input 

puts "\t", strFile 

for index, regEx in regExes 

    actualNode = regExes[index] 
    print actualNode, "\n" 
    strFile.gsub! actualNode[0], "#{actualNode[1]}#{$1}#{actualNode[2]}" 

end 

puts strFile 

Was soll ich tun?

+0

Verwenden faul Matching: '/ b \ (.? (*) \) /' –

+0

Ok, eine Sache gelöst ist, aber ich habe immer noch die Probleme mit ** der h-Gruppe Tags * * –

+0

** das Problem in den Werten liegt, die Sätze sind ** –

Antwort

2

Sie müssen die reguläre Ausdrücke in dieser Reihenfolge (und achten Sie auf die faule Matching mit starken, unterstrichen und fett-Tags und die Wortgrenze \b vor definieren jeder von denen, um sicherzustellen, dass wir Teile von Wörtern) nicht übereinstimmen:

regExes = { 

    h3: [/^### (.*)$/, "<h3>", "</h3>"], 
    h2: [/^## (.*)$/, "<h2>", "</h2>"], 
    h1: [/^# (.*)$/, "<h1>", "</h1>"], 
    b: [/\bb\((.*?)\)/, "<strong>", "</strong>"], 
    i: [/\bi\((.*?)\)/, "<i>", "</i>"], 
    u: [/\bu\((.*?)\)/, "<u>", "</u>"], 
} 

und dann eine nicht-destruktive verwenden gsub:

input = input.gsub(actualNode[0], "#{actualNode[1]}\\1#{actualNode[2]}") 

Sehen Sie dieses IDEONE demo

1

Anstelle der gsub! Linie versuchen, diese ...

strfile = actualNode[1]+actualNode[0].match(strfile)[1]+actualNode[2] if actualNode[0].match(strfile) 
+1

Es TT nicht funktioniert, ich werde nur die erste 'h1' –

+0

Sie enthalten den Teil, wo ich' + actualNode [2] 'geschrieben hat? Sie scrollt, um die ganze Linie zu sehen? – SteveTurczyn

+0

Ich testete das in irb. – SteveTurczyn