Quiero ver si hay coincidencias entre mis dos expresiones regulares. Para hacer esto, solo realizo una .test entre sí, y si uno de ellos coincide con true , los considero coincidentes.
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) ); };Para los comodines al final del texto, funciona de maravilla.
const stringA = 'john:alex:*'; const stringB = 'john:*'; console.log('compare', compare(stringA, stringB)) // true Sin embargo, no pude hacer que la función funcionara si había palabras adicionales al final. Quiero que mi función trate la cadena A que contiene un comodín, como igual a la palabra doe en la cadena B.
const stringA = 'john:alex:*'; const stringB = 'john:*:doe'; console.log('compare', compare(stringA, stringB)) // falseAl comparar dos expresiones regulares separadas, ¿cómo puedo lograr esto? Agradecería alguna ayuda con esto.
Suponiendo que * significa "cualquier número de caracteres", su relación de equivalencia se puede escribir como
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' ))