Tengo algunas cadenas de ejemplo que necesito procesar
string1 = "_Wondrous item, common (requires attunement by a wizard or cleric)_" string2 = "_Weapon (glaive), rare (requires attunement)_" string3 = "_Wondrous item, common_"Quiero dividirlos en los siguientes
group1 = { type: "Wonderous item"; rarity: "common"; attune: True class: "wizard or cleric" } group2 = { type: "Weapon (glaive)"; rarity: "rare"; attune : True } group3 = { type: "Wondrous item" rarity: "common" attune: False }la expresión regular que tengo actualmente es desordenada y probablemente ineficiente, pero solo descompone la primera.
regex = /_(?<type>[^:]*),\s(?<rarity>[^:]*)\s\((?<attune>[^:]+)by a(?<class>[^:]*)\)_/UDetalles agregados
Para obtener todos los grupos para las 3 líneas usando su patrón:
_(?<type>[^:]*?),\s+(?<rarity>[^:]*?)(?:\s+\((?<attune>[^:]+?)\s*(?:by\s+a\s+(?<class>[^:]*?))?\))?__(?<type>[^:]*?) Coincidencia _ , el tipo de grupo coincide con cualquier carácter excepto : no codicioso, ,\s Match y un carácter de espacio en blanco(?<rarity>[^:]*?) La rareza del grupo coincide con cualquier carácter excepto : no codicioso(?: grupo de no captura\s\( Coincide con un carácter de espacio en blanco y ((?<attune>[^:]+?)\s* group attune coincide con cualquier carácter excepto : non greedy(?:by a\s+(?<class>[^:]*?))? Opcionalmente, haga coincidir by a clase de grupo que coincida con cualquier carácter excepto : no codicioso\) Partido ))?_ Hacer que el grupo externo sea opcional y hacer coincidir _Vea una demostración de expresiones regulares .
Usando la propiedad de groups , si es compatible , puede verificar los valores y actualizar el objeto en consecuencia.
const regex = /_(?<type>[^:]*?),\s+(?<rarity>[^:]*?)(?:\s+\((?<attune>[^:]+?)\s*(?:by\s+a\s+(?<class>[^:]*?))?\))?_/; [ "_Wondrous item, common (requires attunement by a wizard or cleric)_", "_Weapon (glaive), rare (requires attunement)_", "_Wondrous item, common_" ].forEach(s => { const m = s.match(regex); if (m) { if (m.groups.class === undefined) { delete m.groups.class; } m.groups.attune = m.groups.attune === undefined ? false : true; console.log(m.groups) } }); Tenga en cuenta que en su patrón desea evitar la coincidencia : en la clase de caracteres negados, pero no hay : en los datos de ejemplo.
Para la primera clase de carácter negado, puede cambiar eso para que no coincida con la coma, y para los demás, excluya la coincidencia con el paréntesis para obtener el mismo resultado.
De esa manera, no todos los cuantificadores tienen que ser no codiciosos y puede evitar algunos retrocesos innecesarios.
_(?<type>[^,]*),\s(?<rarity>[^:()]*)(?:\s\((?<attune>[^()]+?)\s*(?:by a\s+(?<class>[^()]*))?\))?_Vea otra demostración de expresiones regulares .