Este es el problema opuesto al reemplazo eficiente de cadenas de JavaScript . Esa solución cubre la inserción de datos en marcadores de posición, mientras que esta pregunta cubre la coincidencia de cadenas y la extracción de datos de marcadores de posición.
Tengo un problema para entender cómo hacer lo siguiente en ES6 JavaScript.
Estoy tratando de encontrar una manera de hacer coincidir cadenas con marcadores de posición y extraer el contenido de los marcadores de posición como propiedades de un objeto. Tal vez un ejemplo ayude.
Dado el patrón:
my name is {name} and I live in {country}
Coincidirá con la cadena:
my name is Mark and I live in England
Y proporciona un objeto:
{ name: "Mark", country: "England" }El objetivo es tomar una cadena y compararla con una serie de patrones hasta que obtenga una coincidencia y luego tenga acceso a los valores del marcador de posición.
¿Puede alguien señalarme en la dirección correcta...
Me sorprendería si se puede hacer con una expresión regular.
La forma en que lo pensaría es la siguiente:
{ o } const extract = (template, str) => { const templateParts = template.split(/{|}/); const extracted = {}; for (let index = 1; index < templateParts.length; index += 2) { const possibleKey = templateParts[index], keyPrefix = templateParts[index - 1], nextPrefix = templateParts[index + 1]; const substringStartIndex = str.indexOf(keyPrefix) + keyPrefix.length; const substringEndIndex = nextPrefix ? str.indexOf(nextPrefix) : str.length; extracted[possibleKey] = str.substring(substringStartIndex, substringEndIndex); } return extracted; } console.log( extract('my name is {name} and I live in {country}', 'my name is Mark and I live in England') );Puede usar grupos de captura con nombre para ese problema, por ejemplo
const string = "my name is Mark and I live in England"; const regEx = /name is\s(?<name>\w+?)\b.*?live in (?<country>\w+?)\b/i; const match = regEx.exec(string); console.log(match?.groups);