Bina ungkapan biasa untuk menambah petikan berganda pada bahagian nilai JSON yang tidak mempunyai petikan berganda
P粉231112437
P粉231112437 2023-08-17 19:06:54
0
1
428

Saya mempunyai banyak rentetan JSON yang cacat, seperti ini:

{ "id":23424938, "nama":aN, "ref":aN, "jul":aN, "kucing":{}, "src":[], "Kod":"SA", "jenis":d, "spesifikasi":[i,j], "kanak-kanak":a }

Saya cuba membina regex untuk menggandakan petikan nilai JSON tanpa kejayaan.

Saya akhirnya menggunakan /":([^"d{[]+?[^,}]?)/ seperti [i,j], ia tidak akan ditukar kepada ["i","j"].

Bolehkah anda membantu saya dengan nilai dalam kurungan?

https://regex101.com/r/CGskmy/1

P粉231112437
P粉231112437

membalas semua (1)
P粉755863750

Tugas ini akan menjadi agak sukar kerana kekaburan. Contohnya,{ "x": [y] }是变成{ "x": "[y]" }还是变成{ "x": ["y"] }?我会假设未加引号的字符串不包含 JSON 控制字符,例如'[', ']', '{', '}', '"', ':', ','.

Saya rasa anda boleh mencapai ini menggunakan kumpulan penangkapan bernama, yang merupakan ciri dalam PHP yang mungkin menggunakan PCRE. Ini memerlukan beberapa pengaturcaraan untuk melaksanakan penggantian. Operasipreg_replacebiasa tidak mencukupi kerana kami tidak menggantikan semua perlawanan.

Ini adalah kaedah yang saya hasilkan. Mula-mula, saya memadankan rentetan yang dipetik dan mengabaikannya. Kedua, saya memadankan nombor dan mengabaikannya. Akhirnya, saya memadankan rentetan yang tidak disebut dan menyimpannya dalam kumpulan penangkap yang dipanggil "tidak disebut". Ambil perhatian bahawa PCRE akan cuba memadankan alternatif ini dalam susunan yang dipadankan. Rentetan tanpa petikan dipadankan hanya jika rentetan dan nombor yang dipetik tidak boleh dipadankan. Ini adalah kunci kepada pendekatan ini.

Setelah saya memadankan semua rentetan yang tidak disebut, ia hanya perlu menggabungkan rentetan keluaran dengan penggantian. Ini dilakukan dengan mengulangi padanan dan menyalin serpihan rentetan ke dalam output.

[^{}\[\]":,\s][^{}\[\]":,]*(?
          

Saya tidak berurusan dengan sintaks nombor JSON penuh, mahupun sintaks JSON sepertitruefalsenull. Semoga jawapan ini adalah titik permulaan dan anda boleh mengubahnya mengikut keperluan anda.

InSyncmenyediakan ungkapan biasa yang bagus yang tidak menggunakan kumpulan penangkap bernama tetapi sebaliknya mengarahkan PCRE untuk melangkau perlawanan yang tidak diingini.

(?: "(?:[^\"rrreee-\x1F\x7F]|\["\/bfnrt]|\u[\dA-Fa-f]{4})*" | -?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)? ) (*SKIP)(*FAIL) | [^{}[\]:,\s]+
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan
    Tentang kita Penafian Sitemap
    Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!