Me gustaría extraer algunos datos del texto que tiene los siguientes patrones.
text1 text1|text2 text1|text2[text3] text1|text2[text3] text4 (text1|text2[text3], text4) text1[text3] text1[text3], text4Hasta ahora logré construir dos expresiones y cuando la primera falla, recurre a la segunda.
/\(?([^|[]*)\|?([^[]*)\[?(.*)\],?\s?([^)]*)\)?/
/([^|]*)\|?(.*)/
Quizás haya una mejor manera de analizarlo.
¿Es posible capturar todo lo anterior con una expresión regular?
Gracias por la ayuda
Ejemplo
const items = [ "text1", "text1|text2", "text1|text2[text3]", "text1|text2[text3] text4", "(text1|text2[text3], text4)", "text1[text3]", "text1[text3], text4" ] const parse = (text) => { const [_, text1, text2, text3, text4] = /\(?([^|[]*)\|?([^[]*)\[?(.*)\],?\s?([^)]*)\)?/.exec(text) || /([^|]*)\|?(.*)/.exec(text) return { text1, text2, text3, text4 }; } for(const text of items) { console.log(parse(text)); }Puedes usar
const items = [ "text1", "text1|text2", "text1|text2[text3]", "text1|text2[text3] text4", "(text1|text2[text3], text4)", "text1[text3]", "text1[text3], text4" ] const parse = (text) => { const [_, text1, text2, text3, text4] = /^\(?([^[|]+)(?:\|([^[]+))?(?:\[([^\][]*)](?:\s*(?:,\s*)?([^\s)].*?))?)?\)?$/.exec(text) return { text1, text2, text3, text4 }; } for(const text of items) { console.log(text, parse(text)); }Vea la demostración de expresiones regulares . Detalles :
^ - comienzo de la cadena\(? - un opcional )([^[|]+) - Grupo 1: uno o más caracteres que no sean [ y |(?:\|([^[]+))? - una secuencia opcional de | y luego Grupo 2: uno o más caracteres que no sean [ tantos como sea posible(?:\[([^\][]*)](?:\s*(?:,\s*)?([^\s)].*?))?)? - una secuencia opcional de\[([^\][]*)] - [ , cero o más caracteres que no sean [ y ] (capturados en el Grupo 3) y luego un ](?:\s*(?:,\s*)?([^\s)].*?))? - una secuencia opcional de\s* - cero o más caracteres de espacio en blanco(?:,\s*)? - una secuencia opcional , y cero o más caracteres de espacio en blanco([^\s)].*?) - Grupo 4: un carácter que no sea un espacio en blanco y ) y luego cero o más caracteres que no sean caracteres de salto de línea, la menor cantidad posible\)? - un opcional )$ - final de la cadena.