【问题标题】:JavaScript how to split a string every n characters while ignoring ANSI codesJavaScript如何在忽略ANSI代码的情况下每隔n个字符拆分一个字符串
【发布时间】:2015-11-05 08:12:30
【问题描述】:

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

【问题讨论】:

标签: javascript regex terminal ansi


【解决方案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"/>

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

【讨论】:

    【解决方案2】:

    您可以将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>');

    【讨论】:

    • 这不考虑字符串中的 ansi 代码。例如。 \033[34mHey y\033[0mou\033[0m
    • @SimonBoudrias 它是一个控制字符,所以它根本没有被打印出来。我编辑了 sn-p 以使用 JSON.stringify() 显示它们
    • 带有 JSON.stringify() 的示例将 \033 替换为 \u001b
    • @SimonBoudrias 这就是它的显示方式。 \u001b\033 完全相同。结果包含实际的\033。它是一个控制字符,所以你不能打印它
    • 在终端打印时它的行为方式不同。
    猜你喜欢
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    相关资源
    最近更新 更多