如果忽略ansi代码,您将如何在每n
个字符处拆分JavaScript字符串? (所以分开每n + length of ansi characters contained in that string
)
将ansi代码保留在最终数组中非常重要。
我知道使用正则表达式你会写/.{1,3}/
之类的东西,但你怎么会忽略计数中的ansi字符?
示例:
鉴于\033[34mHey \033[35myou\033[0m
,您将如何分割每3个字符以获得:
[
'\033[34mHey',
' \033[35myo',
'u\033[0m'
]
答案 0 :(得分:1)
以下是实现所需目标的方法:
s = "\033[34mHey \033[35myou\033[0mfd\033[1m";
chunks = s.match(/(?:(?:\033\[[0-9;]*m)*.?){1,3}/g);
var arr = [];
[].forEach.call(chunks, function(a) {
if (!/^(?:\033\[[0-9;]*m)*$/.test(a)) {
arr.push(a);
}
});
document.getElementById("r").innerHTML = JSON.stringify(arr);

<div id="r"/>
&#13;
请注意,八进制代码可以直接在正则表达式中使用。我们在forEach
调用中过滤了所有空的和ANSI颜色代码元素。
答案 1 :(得分:0)
您可以将ANSI颜色转义符匹配为\x1B\[[\d;]*m
,并且只计算除转义符[^\x1B]
之外的所有字符
/(?:(?:\x1B\[[\d;]*m)*[^\x1B]){1,3}/g
此外,要在字符串末尾包含转义符作为最后一个标记的一部分:
/(?:(?:\x1B\[[\d;]*m)*[^\x1B]){1,3}(?:(?:\x1B\[[\d;]*m)+$)?/g
<强>代码强>
subject = "\033[34mHey y\033[0mou\033[0m";
pattern = /(?:(?:\x1B\[[\d;]*m)*[^\x1B]){1,3}(?:(?:\x1B\[[\d;]*m)+$)?/g;
result = subject.match(pattern);
document.write('<pre>' + JSON.stringify(result) + '</pre>');
&#13;