Me gustaría extraer valores de una cadena de valores separados por punto y coma que también podrían contener punto y coma pero no como separador. El RegEx que encontré en este sitio web (perdí la publicación) está casi completo porque separa la clave y su valor.
Ejemplo: my.parameter 10; the.foo "Procedural Map"; pve; server.description "This; is \"my\", my description,.\n"
Resultado actual con [^; "]+|"(?:\\"|[^"])*"/g
[ 'server.seed', '10', 'pve', 'server.level', '"Procedural Map"', 'server.description', '"This; is \\"my\\", server; description,."' ]Resultado deseado
[ 'my.parameter 10', 'the.foo "Procedural Map"', 'pve', 'server.description "This; is \"my\", server; description,.\n"' ] ¿Me pueden ayudar a mejorar el RegEx para agrupar el parámetro y su valor?
Encontré una solución reemplazando el separador por el separador ASCII (␟) y luego dividiendo el resultado.
const separatorPattern = /; (?=([^"]*"[^"]*")*[^"]*$)/g; const myRawString = "server.seed 10; server.pve, server.level \"Procedural Map\"; server.description \"This; is \\\"my\\\", server; description,.\""; const replacedSeparator = myRawString.replace(separatorPattern, "␟"); const parameters = replacedSeparator.split("␟"); console.log(parameters); /*[ 'server.seed 10', 'server.pve, server.level "Procedural Map"', 'server.description "This; is \\"my\\", server; description,."' ]*/Puede usar un patrón repetitivo para hacer coincidir primero cualquier carácter excepto el ; y luego, opcionalmente, haga coincidir desde una apertura hasta el cierre de comillas dobles y haga coincidir las comillas dobles escapadas en el medio.
Después de eso, opcionalmente, repita la clase de caracteres [^";\\]* para que coincida también con lo que viene después de la comilla doble de cierre.
[^;"\\]+(?:"(?:[^"\\]*(?:\\.[^"\\]*)*)"[^";\\]*)*[^;"\\]+ Coincidencia 1+ veces cualquier carácter excepto ; " \(?: Grupo de no captura para repetir como un todo" literalmente(?: grupo de no captura[^"\\]* Coincide 0+ veces con cualquier carácter excepto " \(?:\\.[^"\\]*)* Opcionalmente, repite la coincidencia de \ y cualquier carácter seguido de 0+ veces cualquier carácter excepto " y \) Cerrar el grupo de no captura" literalmente[^";\\]* Opcionalmente coincide con cualquier carácter excepto " ; \)* Cierre el grupo externo de no captura y, opcionalmente, repita