此正则表达式从字符串/\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}]