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

> '\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",
  },
  ...
]


做到这一点的最佳方法是什么?

最佳答案

做到这一点的最佳方法是什么?


可能不是使用正则表达式,并且在构建它时我几次破坏了我的开发工具,但是在这里您可以执行以下操作:

>>> 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}]

09-25 19:19