JavaScript 中包含转义序列的正则表达式对于 jquery 终端不起作用

Regular expression containing an escape sequence in JavaScript for jquery terminal not working

我正在尝试在 jQuery 终端中执行特殊字符功能。我能够成功执行退格功能,但在执行转义功能时遇到问题。

这是我尝试执行的代码。 使用的正则表达式:

(^|[^\x08]|\r\n|&[^;]+\x08|[\x1B[K]

输入字符串:

Checking current state.\t[    ]\b\b\b\b\b-\r\u001B[KChecking current state.\t[    ]\b\b\b\b\bFAIL\n\r\u001B

预期最终输出:

Checking current state.      [FAIL}

这里\x1B[K是特殊字符,我想执行它的功能。(\x1B[K = clear line)

解决方法如下:

$.terminal.defaults.formatters.unshift([
    /(^|[^\x08]|[\r\n]{2}|&[^;]+;)\x08|[^\r\n]+\r\x1B(?:\[|[)K/g, '', {loop: true}
]);

除了最后一个 ] 几乎可以正常工作,因为正则表达式正在删除 \b 之前的字符并且不移动光标。

(?:\[|[)K 是必需的,因为命令行接受带有 html 个实体的第一个编码输入,因此您不能键入格式。

选项是 1.18.0 版的新功能,它会循环替换直到与正则表达式不匹配。

var term = $('body').terminal();


$.terminal.defaults.formatters.unshift([
    /(^|[^\x08]|[\r\n]{2}|&[^;]+;)\x08|[^\r\n]+\r\x1B(?:\[|[)K/g, '', {loop: true}
]);
var str = 'Checking current state.\t[    ]\b\b\b\b\b-\r\u001B[KChecking current state.\t[    ]\b\b\b\b\bFAIL\n\r\u001B';
term.insert(str).echo(str);
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script><script src="https://rawgit.com/jcubic/leash/master/lib/wcwidth.js"></script><script src="https://unpkg.com/jquery.terminal/js/jquery.terminal.js"></script><script src="https://rawgit.com/inexorabletash/polyfill/master/keyboard.js"></script><script src="https://unpkg.com/jquery.terminal/js/unix_formatting.js"></script><script src="https://unpkg.com/prismjs@1.8.1/prism.js"></script><script src="https://unpkg.com/jquery.terminal/js/less.js"></script><script src="https://unpkg.com/jquery.terminal/js/prism.js"></script><link rel="stylesheet prefetch" href="https://unpkg.com/prismjs/themes/prism-coy.css"><link rel="stylesheet prefetch" href="https://unpkg.com/jquery.terminal/css/jquery.terminal.css">

编辑

在 unix_formatting 文件的 devel 分支中修复了更好的改写,但它需要更多的工作才能使其与命令行一起工作,现在它只与 echo 一起工作。

var term = $('body').terminal();

var str = 'Checking current state.\t[    ]\b\b\b\b\b-\r\u001B[KChecking current state.\t[    ]\b\b\b\b\bFAIL\r\n';
term.insert(str).echo(str);
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script><script src="https://rawgit.com/jcubic/leash/master/lib/wcwidth.js"></script><script src="https://rawgit.com/jcubic/jquery.terminal/devel/js/jquery.terminal.js"></script><script src="https://rawgit.com/inexorabletash/polyfill/master/keyboard.js"></script><script src="https://rawgit.com/jcubic/jquery.terminal/devel/js/unix_formatting.js"></script><script src="https://unpkg.com/prismjs@1.8.1/prism.js"></script><script src="https://unpkg.com/jquery.terminal/js/less.js"></script><script src="https://unpkg.com/jquery.terminal/js/prism.js"></script><link rel="stylesheet prefetch" href="https://unpkg.com/prismjs/themes/prism-coy.css"><link rel="stylesheet prefetch" href="https://unpkg.com/jquery.terminal/css/jquery.terminal.css">

此函数已经取代了 unix_formatting 中简单的过度输入版本。但是为了完全工作,我需要更新 API 以允许 return 字符串和来自函数格式化程序的位置,就像 tracking_replace 实用程序用于可以改变字符串长度的正则表达式格式化程序,而不当你将它插入终端时(使用 copy/paste 或使用插入功能),你将没有正确的位置,但它适用于 echo.