Necesito hacer coincidir todos los pares de valores clave de un JSON complejo, pero solo los valores que son texto / Cadena.

Por ejemplo de:

{"results":[
{"id":16,"name":"some name1","location":"some  location1","parent":true, ,"region":"some region"},
{"id":157,"name":"some name2" , "location":some location2","parent":true}
],"totalCount":170}

Necesito hacer coincidir:

"name" 
"some name1"
"location"
"some location1"
"region"
"some region1"
etc

Tengo este [^:]+\"(?=[,}\s]|$), pero solo coincide con los valores (que son correctos).

También necesito hacer coincidir las claves: "nombre", "ubicación", "región" (y puede haber otros nombres de clave)

A continuación, se muestra un ejemplo de valores coincidentes https://regex101.com/r/m8FePZ/6

0
andreyro 22 ene. 2021 a las 22:42

1 respuesta

La mejor respuesta

Como señalaron otros, si desea una solución sólida, use un analizador JSON en su idioma.

Si desea usar expresiones regulares y el motor admite mirar atrás, puede usar esto:

/("[^"]*"(?=:")|(?<=":)"[^"]*")/g

Explicación:

  • | - o combinación de:
    • "[^"]*"(?=:"): cita, 0+ no comillas, cita, seguida de una búsqueda anticipada positiva de dos puntos y una cita
    • (?<=":)"[^"]*": búsqueda retrospectiva positiva para comillas y dos puntos, seguidas de comillas, 0+ no comillas, comillas

Si desea excluir las comillas en las coincidencias, use esta expresión regular:

/(?<=")([^"]*(?=":")|(?<=":")[^"]*)/g

Tenga en cuenta que estas expresiones regulares fallan para casos de esquina de cobertura, como espacios en blanco alrededor de claves y valores, comillas de escape en valores, etc. Por lo tanto, es más seguro usar un analizador JSON real.

1
Peter Thoeny 22 ene. 2021 a las 22:06