获取一个包含字符的数组,以及来自输入字符串的ANSI颜色

时间:2014-11-23 08:29:19

标签: javascript regex node.js

此正则表达式从字符串中删除ANSI颜色:/\u001b\[.*?m/g

> '\u001b[1m\u001b[38;5;231mHello World\u001b[0m\u001b[22m'.replace(/\u001b\[.*?m/g, '')
'Hello World'

我们如何提取像这样的对象数组:

[
  {
    start: "\u00\u001b[1m\u001b[38;5;231",
    end: "\u001b[0m\u001b[22m",
    content: "H"
  },
  {
    start: "\u00\u001b[1m\u001b[38;5;231",
    content: "e"
    end: "\u001b[0m\u001b[22m",
  },
  ...
]

最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

  

最佳方法是什么?

可能没有正则表达式,我在构建它时多次撞毁我的开发工具,但是你走了:

>>> str = '\u001b[1m\u001b[38;5;231mHello World\u001b[0m\u001b[22m'
    re = /((?:\u001b\[.*?m)+)([^])([^]|)(?=.*?((?:\u001b\[.*?m)+)|)/
    var foo, bar = []

    while (null != (foo = str.match(re)))
      if ('' !== foo[3]) {
        if ('\u001b' === foo[2])
          str = ''
        else {
          bar.push({
            'start': foo[1],
            'content': foo[2],
            'end': foo[4]
          })
          str = str.replace(re, '$1$3')
        }
      } else
        str = str.replace(re, '$3')

    bar
<<< [{start:'\u001b[1m\u001b[38;5;231m',content:'H',end:'\u001b[0m\u001b[22m'},{start:'\u001b[1m\u001b[38;5;231m',content:'e',end:'\u001b[0m\u001b[22m'},{start:'\u001b[1m\u001b[38;5;231m',content:'l',end:'\u001b[0m\u001b[22m'},{start:'\u001b[1m\u001b[38;5;231m',content:'l',end:'\u001b[0m\u001b[22m'},{start:'\u001b[1m\u001b[38;5;231m',content:'o',end:'\u001b[0m\u001b[22m'},{start:'\u001b[1m\u001b[38;5;231m',content:'',end:'\u001b[0m\u001b[22m'},{start:'\u001b[1m\u001b[38;5;231m',content:'W',end:'\u001b[0m\u001b[22m'},{start:'\u001b[1m\u001b[38;5;231m',content:'o',end:'\u001b[0m\u001b[22m'},{start:'\u001b[1m\u001b[38;5;231m',content:'r',end:'\u001b[0m\u001b[22m'},{start:'\u001b[1m\u001b[38;5;231m',content:'l',end:'\u001b[0m\u001b[22m'},{start:'\u001b[1m\u001b[38;5;231m',content:'d',end:'\u001b[22m'}]

还要处理'\u001b[1m\u001b[38;5;231mHello\u001b[0m\u001b[22m World'之类的字符串:

>>> str = '\u001b[1m\u001b[38;5;231mHello\u001b[0m\u001b[22m World'
    re = /((?:\u001b\[.*?m)+)([^])([^]|)(?=.*?((?:\u001b\[.*?m)+)|)/
    var foo, bar = []

    while (null != (foo = str.match(re)))
      if ('\u001b' === foo[2])
        str = str.replace(re, '$2$3')
      else {
        bar.push({
          'start': foo[1],
          'content': foo[2],
          'end': foo[4]
        })
        str = str.replace(re, '$1$3')
      }

    bar
<<< [{start:'\u001b[1m\u001b[38;5;231m',content:'H',end:'\u001b[0m\u001b[22m'},{start:'\u001b[1m\u001b[38;5;231m',content:'e',end:'\u001b[0m\u001b[22m'},{start:'\u001b[1m\u001b[38;5;231m',content:'l',end:'\u001b[0m\u001b[22m'},{start:'\u001b[1m\u001b[38;5;231m',content:'l',end:'\u001b[0m\u001b[22m'},{start:'\u001b[1m\u001b[38;5;231m',content:'o',end:'\u001b[22m'},{start:'\u001b[1m\u001b[38;5;231m\u001b[0m\u001b[22m',content:'',end:undefined},{start:'\u001b[1m\u001b[38;5;231m\u001b[0m\u001b[22m',content:'W',end:undefined},{start:'\u001b[1m\u001b[38;5;231m\u001b[0m\u001b[22m',content:'o',end:undefined},{start:'\u001b[1m\u001b[38;5;231m\u001b[0m\u001b[22m',content:'r',end:undefined},{start:'\u001b[1m\u001b[38;5;231m\u001b[0m\u001b[22m',content:'l',end:undefined},{start:'\u001b[1m\u001b[38;5;231m\u001b[0m\u001b[22m',content:'d',end:undefined}]