此正则表达式从字符串中删除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",
},
...
]
最佳方式是什么?
答案 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}]