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 颜色代码的元素。
您将如何在忽略 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 颜色代码的元素。