如何解决在Ruby中编写标头HTML标签markdown解析器
以下是我能想到的最好的方法;
def markdownparser(markdown)
if markdown.match("#")
arr = markdown.split("")
i = 0
while arr[i] != " "
if arr[i] == "#"
i += 1
end
end
final = markdown[(i + 1)..(markdown.size + i)]
return "<h" + i.to_s + ">" + final + "</h" + i.to_s + ">"
else
return markdown
end
end
puts markdownparser(" smaller header")
简单的markdown解析器功能:
- 单行减价
- 将其翻译成适当的HTML标头标记
标题由(1-6)哈希指定,后跟空格,后跟文本。散列的数量确定HTML输出的标头级别。
- 标题内容应仅在初始标签之后 加上空格字符。
- 无效的标头仅应返回为降价,而不进行任何翻译。
- 标头内容和主题标签之前和之后的空格必须在结果输出中忽略
如何进一步降低时间复杂度?
非常感谢
解决方法
用标准方法替换显式循环
您正在循环执行许多操作,因此,除非您有一个非常具体的用例而不使用Ruby的优化方法,否则我将避免这种情况。有内置的核心或标准库方法可用于进行计数或替换文本等操作,因此我会尽可能使用它们。如果速度确实很重要,那么我还选择字符串插值,而不是与String#+串联,在每个子表达式中创建一个新的中间字符串。
一种实现方式如下:
md_str = <<~'EOF'
# Header 1
Lorem ipsum dolor sit amet,consectetur adipisici elit,sed eiusmod tempor
incidunt ut labore et dolore magna aliqua.
## Header 2
Etiam habebis sem dicantur magna mollis euismod.
####### Invalid Header with 7 "#" Characters
^^^^^^^ Too many characters to be valid.
EOF
# helper method to count header characters
def header_level str
str&.count "#"
end
# replace markdown headers with html headers;
# escape hash in regex so it won't be treated as interpolation;
# block form required for proper handling of match variables
md_str.gsub!(/^(\#{1,6})\s+(.*)$/) { |_| "<h#{header_level $1}>#{$2}</h>" }
puts md_str
这利用String#count来计算字符串中#
个字符的数量,而不必循环遍历。 String#gsub仅在以标头字符开头的行上调用#header_level。
注意事项
- 显然,这不处理“带下划线”的标头,但这不属于您的问题。
- 将文件与一次行处理相提并论涉及多种折衷,但是如果没有上下文行,很难进行复杂的解析。
- 测试benchmarking不能替代给定的一段代码是否真的更快。
- 这种方法本身并不能消除迭代。只要有可能,它就将迭代卸载到以C速度运行的方法中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。