2016-05-10 3 views
2

Я пытаюсь разработать супер основной язык шаблонов, и у меня есть проблемы с RegEx, я стараюсь, чтобы преобразовать это:Regex замена цепи вопрос

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

к этому:

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

Но я получаю это:

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

Вот мой код:

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 

Что мне делать?

+0

Используйте ленивое соответствие: '/ б \ (.? (*) \) /' –

+0

Хорошо, одна вещи решена, но я до сих пор есть проблемы с ** тегами ч группы * * –

+0

** Проблема находится в значениях, которые являются наборами ** –

ответ

2

Вы должны определить регулярные выражения в таком порядке (и ум ленивого соответствия с сильным, подчеркиванием и смелые теги и слово граничных \b перед каждого из них, чтобы убедиться, что мы не соответствуют части слов):

regExes = { 

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

, а затем использовать неразрушающие gsub:

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

Смотрите эту IDEONE demo

1

Вместо gsub! линии попробовать это ...

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

Не работает TT, Я получаю только первый 'h1' –

+0

Вы включили часть, где я написал' + actualNode [2] '? Вы прокрутили, чтобы увидеть всю линию? – SteveTurczyn

+0

Я тестировал это в irb. – SteveTurczyn