Necesito extraer una cadena JSON que se encuentra dentro de una cadena más grande (lo sé, mala respuesta de API con la que tengo que lidiar). De todos modos, construí una sola expresión regular para leer todo dentro de {} y funciona en todos los casos probados, excepto por la respuesta API real en el fragmento a continuación.
¿Alguna idea de por qué no funciona y cómo hacer que funcione?
let dd = 'Error: Internal JSON-RPC error.\n{\n "code": 3,\n "message": "execution reverted: This limited season is sold out. Please wait for the next season.",\n "data": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004154686973206c696d6974656420736561736f6e20697320736f6c64206f75742e20506c65617365207761697420666f7220746865206e65787420736561736f6e2e00000000000000000000000000000000000000000000000000000000000000"\n}'; alert(RegExp(/{.*}/).exec(dd))El contenido no coincide entre varias líneas, por lo que puede usar el modificador /s para incluir nuevas líneas. Tampoco se necesita Regexp() cuando se usa la sintaxis de expresiones regulares ( /{.*}/s es lo mismo que Regexp('{.*}','s') ):
alert(/{.*}/s.exec(dd)) let dd = 'Error: Internal JSON-RPC error.\n{\n "code": 3,\n "message": "execution reverted: This limited season is sold out. Please wait for the next season.",\n "data": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004154686973206c696d6974656420736561736f6e20697320736f6c64206f75742e20506c65617365207761697420666f7220746865206e65787420736561736f6e2e00000000000000000000000000000000000000000000000000000000000000"\n}'; alert(/{.*}/s.exec(dd))Debe agregar un indicador s como segundo argumento a su constructor RegExp :
s - ("dotAll") Permite . para hacer coincidir las nuevas líneas.
let dd = 'Error: Internal JSON-RPC error.\n{\n "code": 3,\n "message": "execution reverted: This limited season is sold out. Please wait for the next season.",\n "data": "0x08c379a00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004154686973206c696d6974656420736561736f6e20697320736f6c64206f75742e20506c65617365207761697420666f7220746865206e65787420736561736f6e2e00000000000000000000000000000000000000000000000000000000000000"\n}'; alert(RegExp('{.*}', 's').exec(dd))https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/RegExp
Con otro enfoque, usar .match() en realidad devolverá la coincidencia con la cadena que desea extraer, que está dentro de {llaves} . con dos banderas s para habilitar la búsqueda de nuevas líneas y g para buscar globalmente
dd.match(/\{(.*)?\}/sg)[0] Resultado {\n "code": 3,\n "message": "execution reverted: T…0000000000000000000000000000000000000000000000"\n}