正则表达式匹配 ANSI 转义码

4

要求提供代码的问题必须展示对问题的基本理解。请包括尝试过的解决方案,为什么它们不起作用以及预期结果。另请参阅:Stack Overflow问题清单 - the Tin Man
10
这怎么是离题了?过度热衷的版主... cc @theTinMan 发帖人确实理解问题领域,但可能不确定如何构建正确的正则表达式。这本来可以成为一个非常有价值的问题/答案线程,但现在却被关闭了。真浪费... - James
1个回答

6

我有一些基于其他代码的代码,由于很久以前了而且我忘记源代码是哪里来的,不过可能是这个。以下是我用来将带颜色的 ANSI 文本转换成标记 HTML 格式的代码:

require "strscan"
class String
    def ansi2html
        ansi = StringScanner.new(self)
        html = StringIO.new
        until ansi.eos?
            if ansi.scan(/\e\[0?m/)
                html.print(%{</span>})
            elsif ansi.scan(/\e\[0?(\d+)m/)
                html.print(%{<span class="#{AnsiColor[ansi[1]]}">})
            else
                html.print(ansi.scan(/./m))
            end
        end
        html.string
    end
end

它与哈希一起使用,定义映射规则:
class String
    AnsiColor = {
        "1" => "bold",
        "4" => "underline",
        "30" => "black",
        "31" => "red",
        "32" => "green",
        "33" => "yellow",
        "34" => "blue",
        "35" => "magenta",
        "36" => "cyan",
        "37" => "white",
        "40" => "bg-black",
        "41" => "bg-red",
        "42" => "bg-green",
        "43" => "bg-yellow",
        "44" => "bg-blue",
        "45" => "bg-magenta",
        "46" => "bg-cyan",
        "47" => "bg-white",
    }
end

我是这样使用它的:

"red \x1b[31mapple\x1b[0m".ansi2html
# => "red <span class=\"red\">apple</span>"

根据您的需求进行修改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接