JavaScript 如何在忽略 ANSI 代码的情况下每 n 个字符拆分一个字符串

JavaScript how to split a string every n characters while ignoring ANSI codes

您将如何在忽略 ANSI 代码的情况下每 n 个字符拆分一个 JavaScript 字符串? (所以拆分每个 n + length of ansi characters contained in that string

将 ansi 代码保留在最终数组中很重要。

我知道使用正则表达式你会写出类似 /.{1,3}/ 的东西,但你如何忽略计数中的 ansi 字符?

示例:

给定 3[34mHey 3[35myou3[0m,你将如何拆分每 3 个字符以获得:

[
  '3[34mHey',
  ' 3[35myo',
  'u3[0m'
]

您可以将 ANSI 颜色转义符匹配为 \x1B\[[\d;]*m,并且只计算除转义符 [^\x1B]

之外的所有字符
/(?:(?:\x1B\[[\d;]*m)*[^\x1B]){1,3}/g

此外,要在字符串末尾包含转义符作为最后一个标记的一部分:

/(?:(?:\x1B\[[\d;]*m)*[^\x1B]){1,3}(?:(?:\x1B\[[\d;]*m)+$)?/g

代码

subject = "3[34mHey y3[0mou3[0m";
pattern = /(?:(?:\x1B\[[\d;]*m)*[^\x1B]){1,3}(?:(?:\x1B\[[\d;]*m)+$)?/g;

result = subject.match(pattern);

document.write('<pre>' + JSON.stringify(result) + '</pre>');

这里有一种方法可以满足您的需求:

s = "3[34mHey 3[35myou3[0mfd3[1m";
chunks = s.match(/(?:(?:3\[[0-9;]*m)*.?){1,3}/g);
var arr = [];
[].forEach.call(chunks, function(a) {
    if (!/^(?:3\[[0-9;]*m)*$/.test(a)) {
  arr.push(a);
    }
});
document.getElementById("r").innerHTML = JSON.stringify(arr);
<div id="r"/>

请注意,八进制代码可以直接在正则表达式中使用。我们在 forEach 调用中过滤所有空的和仅 ANSI 颜色代码的元素。