Tratando de extraer correctamente todos los términos del texto. Parece que cuando el término está dentro de la oración y el término contiene () , no está dividido y la expresión regular no pudo encontrarlo.
Estoy tratando de dividir correctamente las coincidencias que contienen () . Así que en lugar de esto:
["What is API(Application Programming Interface) and how to use it?"]
Estoy tratando de conseguir esto:
["What is", "API(Application Programming Interface)", "and how to use it?"]
El término JSON se extrae correctamente y obtengo esto:
["JSON", "is a Javascript Object Notation"] así que esto es exactamente lo que quiero, pero en el caso de la API no obtengo esto:
["What is", "API(Application Programming Interface)", "and how to use it?"]
Estoy recibiendo esto y esto no es lo que quiero:
["What is API(Application Programming Interface) and how to use it?"]
function getAllTextNodes(element) { let node; let nodes = []; let walk = document.createTreeWalker(element,NodeFilter.SHOW_TEXT,null,false); while (node = walk.nextNode()) nodes.push(node); return nodes; } const allNodes = getAllTextNodes(document.getElementById("body")) const terms = [ {id: 1, definition: 'API stands for Application programming Interface', expression: 'API(Application Programming Interface)'}, {id: 2, definition: 'JSON stands for JavaScript Object Notation.', expression: 'JSON'} ] const termMap = new Map( [...terms].sort((a, b) => b.expression.length - a.expression.length) .map(term => [term.expression.toLowerCase(), term]) ); const regex = RegExp("\\b(" + Array.from(termMap.keys()).join("|") + ")\\b", "ig"); for (const node of allNodes) { const pieces = node.textContent.split(regex).filter(Boolean); console.log(pieces) } <div id="body"> <p>API(Application Programming Interface)</p> <p>What is API(Application Programming Interface) and how to use it?</p> <p>JSON is a Javascript Object Notation</p> </div>Como sus "palabras" pueden consistir en caracteres que no son palabras, no puede confiar en los límites de las palabras. Sugeriría cambiar a límites de palabras inequívocos ( (?<!\w) / (?!\w) ) o dinámicos adaptables .
Además, debe escapar de sus términos antes de usarlos en la expresión regular.
Vea a continuación un ejemplo con límites de palabras adaptables:
function getAllTextNodes(element) { let node; let nodes = []; let walk = document.createTreeWalker(element,NodeFilter.SHOW_TEXT,null,false); while (node = walk.nextNode()) nodes.push(node); return nodes; } const allNodes = getAllTextNodes(document.getElementById("body")) const terms = [ {id: 1, definition: 'API stands for Application programming Interface', expression: 'API(Application Programming Interface)'}, {id: 2, definition: 'JSON stands for JavaScript Object Notation.', expression: 'JSON'} ] const termMap = new Map( [...terms].sort((a, b) => b.expression.length - a.expression.length) .map(term => [term.expression.toLowerCase(), term]) ); const regex = RegExp("(?:(?!\\w)|\\b(?=\\w))(" + Array.from(termMap.keys()).map(x => x.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&')).join("|") + ")(?:(?<=\\w)\\b|(?<!\\w))", "ig"); for (const node of allNodes) { const pieces = node.textContent.split(regex).filter(Boolean); console.log(pieces) } <div id="body"> <p>API(Application Programming Interface)</p> <p>What is API(Application Programming Interface) and how to use it?</p> <p>JSON is a Javascript Object Notation</p> </div> La expresión regular ahora es (?:(?!\w)|\b(?=\w))(api\(application programming interface\)|json)(?:(?<=\w)\b|(?<!\w)) donde
(?:(?!\w)|\b(?=\w)) - límite de palabra adaptativo izquierdo (sin verificación de contexto si el siguiente carácter es un carácter que no es una palabra)(api\(application programming interface\)|json) - Grupo 1 que coincide con uno de sus términos (ver caracteres especiales de escape)(?:(?<=\w)\b|(?<!\w)) - límite de palabra adaptable a la derecha (sin verificación de contexto si el carácter anterior no es un carácter de palabra)