繁体   English   中英

仅捕获字母后跟字母,不包括某些单词 - 正则表达式

[英]Capture only letter followed by letter, excluding some words - Regex

我需要在字符串中捕获一个字母,后跟一个字母,不包括某些特定单词。 我在 Latex 中有以下字符串:

22+2p+p^{pp^{2p+pp}}+\delta+\pi+sqrt(2p)+\\frac{2}+{2p}+ppp+2P+\sqrt+xx+\to+p2+\pi+px+ab+\alpha

我想在字母之间添加* ,但我不想应用以下单词:

\frac
\delta
\pi
\sqrt
\alpha

输出应如下所示:

22+2p+p^{p*p^{2p+p*p}}+\delta+\pi+\sqrt(2p)+\\frac{2}+{2p}+p*p*p+2P+\sqrt(9)+x*x+\to+p2+\pi+p*x+a*b+\alpha

字母是动态条目,可以是任何字母表。 我想过使用“积极的后视”,但它的支持是有限的。

您可以使用正则表达式将字符串替换为回调来实现您想要的结果:

(delta|frac|pi|sqrt|alpha|to)|([a-z](?=[a-z]))

匹配第 1 组中排除的单词之一或后跟第 2 组中另一个字母的字母。在回调中,如果第 1 组存在,则返回,否则返回第 2 组,后跟*

 let str = '22+2p+p^{pp^{2p+pp}}+\\\\delta+\\\\pi+\\\\sqrt(2p)+\\\\\\\\frac{2}+{2p}+ppp+2P+\\\\sqrt(9)+xx+\\\\to+p2+\\\\pi+px+ab+\\\\alpha'; const replacer = (m, p1, p2) => { return p1 ? p1 : (p2 + '*'); } console.log(str.replace(/(delta|frac|pi|sqrt|alpha|to)|([az](?=[az]))/gi, replacer));

你可以这样做:

 const str = "22+2p+p^{pp^{2p+pp}}+\\\\delta+\\\\pi+\\\\sqrt(2p)+\\\\\\\\frac{2}+{2p}+ppp+2P+\\\\sqrt+xx+\\\\to+p2+\\\\pi+px+ab+\\\\alpha"; const result = str.replace(/\\\\?[a-zA-Z]{2,}/g, (v) => { if (v.startsWith('\\\\')) { return v; } return v.split("").join("*"); }); console.log(result);

这样做是匹配所有 2 个或多个以\\开头的连续字母,或者在替换函数中,如果匹配的组不是以\\开头,则替换设置为字母组 split 并由*

您可以使用negative lookbehind来解决此问题。

 const regex = /(?<!\\\\{1,})(\\b[a-zA-Z]{2,}\\b)/g; const str = `22+2p+p^{pp^{2p+pp}}+\\\\delta+\\\\pi+\\\\sqrt(2p)+\\\\\\\\frac{2}+{2p}+ppp+2P+\\\\sqrt+xx+\\\\to+p2+\\\\pi+px+ab+\\\\alpha`; let m; let result = str.replace(regex, function(match) { return match.split("").join("*"); }); console.log("Match: ",str.match(regex).toString()); console.log(result);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM