正则表达链替换问题

时间:2016-05-10 21:40:55

标签: ruby 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

我该怎么办?

2 个答案:

答案 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 :(得分:1)

而不是gsub!行试试这个......

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