Quiero obtener todas las categorías enumeradas en el ejemplo a continuación, fruta y carne, pero no la palabra obligatoria, pero quiero seguir siendo obligatoria si está presente:
categories fruit meat mandatoryTraté de inspirarme en Match Everything excepto las cadenas especificadas.
https://regex101.com/r/peXJXx/1
/(categories )(^(?!.+(mandatory)))(mandatory)?/gisPero no puedo hacerlo funcionar
const r = 'categories fruit meat mandatory'; const [, ...categories] = r.split(' ').filter(_ => _ !== 'mandatory');No necesita Regex para tal problema, usé split (' ') para dividir la cadena en palabras (convertirla en una matriz), luego filtrarlas de 'obligatorio', también usé desestructuración para eliminar el primer elemento.
Si insiste en usar expresiones regulares, esto podría ser lo que desea.
const input = "categories fruit meat mandatory"; const regex = /\w+/gm; const regex2 = /^\w+/g; const results = input.matchAll(regex); let type = input.match(regex2)[0]; let isMandatory = false; let isCategory = false; let categories = []; for (const result of results){ switch(result[0]){ case "categories": isCategory = true; break; case "mandatory": isMandatory = true; break; default: categories.push(result[0]); } } console.log("Type: " + type); console.log("Categories: " + categories.join(", ")); console.log("Mandatory: " + (isMandatory ? "Yes" : "No")); Type: categories Categories: fruit, meat Mandatory: Yes Puedes arreglarlo como quieras. Esencialmente, si tiene varias entradas, recorrería cada cadena y ejecutaría este código. Si tiene otros tipos en lugar de categoría, puede agregar algo como isDepartment = false y luego, en el cambio, haga case "departments": isDepartment = true; break; .
También puede simplemente modificar la expresión regular para ignorar la primera palabra y crear un segundo patrón de expresión regular para identificar cómo es específicamente la primera palabra const regex2 = /^\w+/g; y luego let type = input.match(regex2)[0]; .
Aquí hay una muestra en vivo https://jsfiddle.net/gey3oqLp/1/
Editar: En realidad, ahora que lo pienso. Si vamos a la ruta de cambio, no necesitamos hacer coincidir nada específico en la expresión regular. Solo necesitamos hacer coincidir cada palabra y tratar con ella más adelante. Eliminé la expresión regular actualizada a la versión más simple.