如何匹配正则表达式对另一个正则表达式在javascript中?



我想看看两个正则表达式之间是否有任何匹配。要做到这一点,我只是对彼此执行.test,如果其中一个匹配true,我认为它们是匹配的。

const toRegex = (str) =>
new RegExp(
'^' +
str
.replace(/[-[]/{}()+.\^$|]/g, '\$&')
.replace(/*/g, '.*')
.replace(/?/g, '.') +
'$',
);
const compare = (
stringA,
stringB,
) => {
return (
toRegex(stringA).test(stringB) ||
toRegex(stringB).test(stringA)
);
};

对于文本末尾的通配符,它就像一个魅力。

const stringA = 'john:alex:*';
const stringB = 'john:*';
console.log('compare', compare(stringA, stringB)) // true

但是,如果末尾有额外的单词,我就无法使该函数工作。我希望我的函数将包含通配符的stringA视为等于stringB中的单词doe

const stringA = 'john:alex:*';
const stringB = 'john:*:doe';
console.log('compare', compare(stringA, stringB)) // false

通过比较两个独立的正则表达式,我该如何完成呢?如果你能帮我,我会很感激的。

假设*意味着"任何数量的characters",你的等价关系可以写成

  • 如果A为空,则B为空,则为真,否则为假
  • 将A和B分割为头(=第一个字符)和尾(其余的)
  • 如果正面相等,则比较两个反面
  • 如果A的头是*,那么尝试A的尾巴对B,然后B.slice(1),然后B.slice(2)等等…
  • 如果B的头是*,交换A和B
  • 否则,假

function isEq(a, b) {
if (!a || !b)
return a === b;
let [headA, tailA] = [a[0], a.slice(1)]
let [headB, tailB] = [b[0], b.slice(1)]
if (headA === headB)
return isEq(tailA, tailB);
if (headA === '*') {
for (let i = 0; i <= b.length; i++)
if (isEq(tailA, b.slice(i)))
return true;
return false;
}
if (headB === '*')
return isEq(b, a)
return false;
}

console.log(isEq(
'john:alex:*',
'john:*:doe'
))
console.log(isEq(
'john:alex:*',
'john:*'
))
console.log(isEq(
'john:*:X',
'john:*:Y'
))

最新更新