假设我有以下字符串。
&eThe quick brown fox &djumps over the &dlazy &adog.
每组颜色代码&letter
,例如&e
将更改以下文字的颜色,直到出现另一个颜色代码。让两个相同的代码跟在一起是多余的,因为它们都是相同的颜色。
&djumps over the &dlazy
我正在尝试合并任何与之前的颜色代码匹配的重复颜色代码,因此上面的字符串将更改为以下内容:
&eThe quick brown fox &djumps over the lazy &adog.
但是我不确定这是怎么做的。有人可以帮忙吗?
答案 0 :(得分:1)
将String.replace
与回调结合使用,并将外部变量与前一种颜色结合使用:
let str = '&eThe quick brown fox &djumps over the &dlazy &adog.';
let last = '';
let result = str.replace(/&([a-z])/g, (match, color) =>
color !== last ? (last = color, match) : ''
);
console.log(result); // &eThe quick brown fox &djumps over the lazy &adog.
答案 1 :(得分:0)
您的标记语言需要一种机制,用于文本包含&
后跟字母的情况(例如D&D
,<
)。确切的解决方案将取决于您的逃生机制。我提供的代码在你的标记语言没有转义机制(BAD!)时有效,而且我还提供了代码,如果你的标记语言的转义机制包括加倍&
(最明显的机制)。
// If you don't have an escape mechanism.
let text = '&eThe quick brown fox &djumps over the &dlazy &adog.';
let prev;
let result = text.replace(
/&([a-zA-Z])/g,
match => match === prev ? '' : ( prev = match ),
);
console.log(result);
或
// If && is an escaped &, and escaping is optional where unambiguous.
let text = '&eThe quick brown fox &djumps over the &dlazy &adog.';
let prev;
let result = text.replace(
/&(.)/g,
function (match) {
return match.replace(
/^&([a-zA-Z])/,
match => match === prev ? '' : ( prev = match ),
);
},
);
console.log(result);