como ya se mencionó en la pregunta de mi proveedor, ¿cómo puedo cambiar una expresión regular con grupos de captura de nombres de un pedido dedicado de los grupos a cualquier pedido que se acepte?
Como ejemplo de mis datos:
{ att1 = "demo1" att2 = "ohno" } { att2 = "demo1" att1 = "ohno" }Si uso esta expresión regular, funcionará para el primer registro pero no para el segundo
/\{[\n\s]*(?:att1 = \"(?<att1>\w*)\"[\n\s]*(?:att2 = \"(?<att2>\w*)\"[\n\s]*\}/gmConectando ambos grupos con un | no ayudará. En su lugar, encuentra solo el último grupo, pero ¿por qué?
/\{[\n\s]*(?:(?:att1 = \"(?<att1>\w*)\"[\n\s]*)|(?:(?:att2 = \"(?<att2>\w*)\"[\n\s]*)\}/gmLa prueba en las herramientas en línea realmente no ayuda porque allí la expresión regular podría funcionar pero no en mi versión local de nodejs 16
Puedes usar esta expresión regular:
/(?<=\{[^}]*?)(?:att1 = "(?<att1>\w*)"|att2 = "(?<att2>\w*)")(?=[^}]*?\})/gExplicación:
(?<=\{[^}]*?) - busque detrás { y cero o más caracteres que no sean } , la menor cantidad posible.
(?: - crear un grupo que no capture con una alternancia
att1 = " - coincide con att1 = " literalmente
(?<att1>\w*) - coincide y captura cero o más caracteres de palabras.
"|att2 = " - coincide con " O àtt2 = "` literalmente
(?<att2>\w*)" - coincide y captura cero o más caracteres de palabra y "
) - grupo final
(?=[^}]*?\}) - buscar cero o más caracteres que no sean } tan pocos como sea posible y el } final
Debe tener la bandera global .
Ahora no le importa el orden, sino que obtiene ambos.