ruby - 正则表达式链替换问题

标签 ruby regex

我尝试开发一种 super 基本模板语言,但我在 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

我应该做什么?

最佳答案

您需要按此顺序定义正则表达式(并注意与强、下划线和粗体标签的惰性匹配以及每个标签前面的单词边界 \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

关于ruby - 正则表达式链替换问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37149435/

相关文章:

javascript - 信用卡信息的正则表达式不应包含字符

python - 哪个正则表达式将获得 python 中开始正则表达式和结束正则表达式之间的所有组匹配?

regex - 为什么这三个正则表达式的步数不同?

php - 如何用正则表达式替换具有相同字符数的多个字符?

Ruby - 救援后如何检查特定异常?

mysql - 向 50M+ 记录表添加列?最有效的方法?

ruby-on-rails - 如何将 school_id 添加到我的路径中?

Ruby - fork 进程上的 set_trace_func

ruby - Sinatra 应用程序 - 在哪里放置 Zurb Foundation?

c# - 用于 URL 验证的正则表达式