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

时间:2015-11-05 08:12:30

标签: javascript regex terminal ansi

如果忽略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'
]

2 个答案:

答案 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;
&#13;
&#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

<强>代码

&#13;
&#13;
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;
&#13;
&#13;