en este caso, creo una expresión regular para el grupo en código, precio, nombre, estado, pero la última línea no coincide, quiero la última línea con el estado Y si no hay una palabra [Y]
Harga: X25=2.335NAME1 25 [X]; X1=5.720NAME2 5 [Y]; X2=10.720NAME3 10 [Y]; X4=4.200NAME4 4; (?<code>.*)\=(?<price>[0-9]{1,3}\.?[0-9]{1,3})(?<name>.*)\s(?:\[(?<status>X|Y)\])Puede cambiar el primer .* a una clase de carácter negado que coincida con cualquier carácter excepto =
El grupo de nombres se puede cambiar a una clase de carácter negado que coincida con cualquier carácter que no sea [ y ]
El uso de [0-9]{1,3}\.?[0-9]{1,3} coincide con al menos 2 dígitos. Si también desea hacer coincidir un solo dígito, puede hacer que el . y los siguientes 1-3 dígitos opcionales
La última parte se puede hacer opcional, incluido el carácter de espacio en blanco para que coincida también con la última línea
(?<code>[^=\n]*)=(?<price>[0-9]{1,3}(?:\.[0-9]{1,3})?)(?<name>[^\][]*?)(?:\s*\[(?<status>[XY])\])?;El patrón coincide:
(?<code>[^=\n]*)= El código de grupo coincide con los caracteres opcionales que no sean = , luego coincide con =(?<price> Precio de grupo[0-9]{1,3}(?:\.[0-9]{1,3})? Haga coincidir 1-3 dígitos y, opcionalmente . y 1-3 dígitos) Cerrar grupo(?<name>[^\][]*?) Nombre del grupo, opcionalmente, haga coincidir cualquier carácter excepto [ y ] lo menos posible(?: grupo de no captura para hacer que toda la parte sea opcional\s*\[(?<status>[XY])\] Opcionalmente haga coincidir los caracteres de espacio en blanco, el estado del grupo coincida con X o Y usando una clase de carácter entre corchetes)?; Cierre el grupo de no captura y haga coincidir el ; al finalDemostración de expresiones regulares
Si el ; al final no es obligatorio, pero tampoco puede ocurrir en el medio, puede excluir la coincidencia como en esta demostración de expresiones regulares .
const regex = /(?<code>[^=\n]*)=(?<price>[0-9]{1,3}(?:\.[0-9]{1,3})?)(?<name>[^\][]*?)(?:\s*\[(?<status>[XY])\])?;/g; const str = `Harga: X25=2.335NAME1 25 [X]; X1=5.720NAME2 5 [Y]; X2=10.720NAME3 10 [Y]; X4=4.200NAME4 4;`; let m; console.log([...str.matchAll(regex)].map(m => m.groups));