我正在尝试验证一些简单的胡子表示法,其中{{foo}}
是正确的,{bar}}
或{{taz}
是不正确的。
这些是我迄今为止尝试过的正则表达式。
/{{.*?}}/g是否正确出现
错误出现的/(^|[^{]){.*?}}/g
和/{{.*?}([^}]|$)/g
问题是不正确的正则表达式匹配正确的出现。
js 上的我的代码
function getTokenMatches(text) {
let tokenMatches = [];
const correctTokenMatches = text.match(/{{.*?}}/g);
if (correctTokenMatches) {
tokenMatches.push(...correctTokenMatches);
}
const openLeftTokenMatches = text.match(/[^{]{.*?}}/g);
if (openLeftTokenMatches) {
tokenMatches.push(...openLeftTokenMatches);
}
const openRightTokenMatches = text.match(/{{.*?}[^}]/g);
if (openRightTokenMatches) {
tokenMatches.push(...openRightTokenMatches);
}
tokenMatches = tokenMatches.map(token => {
let regex = new RegExp(/{{.*?}[^}]/g);
if (regex.test(token)) {
token = `${token}}`;
}
regex = new RegExp(/[^{]{{.*?}/g);
if (regex.test(token)) {
token = `{${token}`;
}
return token;
});
return tokenMatches;
}
示例:https://regex101.com/r/hD9oI7/4
您可以尝试先删除"好"模式,然后匹配{+ ... }+
以找到"坏"模式:
markup = `
{{ this }} is {{ fine }} and so is {{ that }}
{this one}} is no good, and so is {{{{this one}
this is {{{more {{complicated}} ?? }
`
good = []
bad = []
m = markup
m = m.replace(/{{[^{}]+}}/g, m => good.push(m))
m = m.replace(/{+[^{}]+}+/g, m => bad.push(m))
console.log(good)
console.log(bad)
根据{{{ this }}
应该是"好"还是"坏",您可以将"好"模式细化为
/[^{]{{[^{}]+}}[^}]/g