我試圖解決在Javascript中使用regEx的相同問題。我有一個爲Node.js編寫的應用程序來解析傳入的JSON,但需要解析器的「寬鬆」版本(請參閱下面的註釋),因爲引用每個關鍵字(名稱)都很不方便。這裏是我的解決方案:
var objKeysRegex = /({|,)(?:\s*)(?:')?([A-Za-z_$\.][A-Za-z0-9_ \-\.$]*)(?:')?(?:\s*):/g;// look for object names
var newQuotedKeysString = originalString.replace(objKeysRegex, "$1\"$2\":");// all object names should be double quoted
var newObject = JSON.parse(newQuotedKeysString);
這裏的正則表達式的細分:
({|,)
查找對象的開始,扁平的物件嵌入式對象{
或,
。
(?:\s*)
發現但不記得空格
(?:')?
發現但不記得單引號(稍後將用雙引號替換)。將會有零或其中一個。
([A-Za-z_$\.][A-Za-z0-9_ \-\.$]*)
是名稱(或關鍵字)。以任何字母,下劃線,$或點開頭,後跟零個或多個字母數字字符或下劃線或破折號或圓點或$。
- 最後一個字符
:
是從值中分隔對象的名稱。
現在我們可以使用replace()
一些修整,讓我們的新報價鍵:
originalString.replace(objKeysRegex, "$1\"$2\":")
其中$1
或者是{
或,
取決於對象是否被嵌入到另一個對象。 \"
增加了一個雙引號。 $2
是這個名字。 \"
另一個雙引號。最後:
完成它。 測試它與
{keyOne: "value1", $keyTwo: "value 2", key-3:{key4:18.34}}
輸出:
{"keyOne": "value1","$keyTwo": "value 2","key-3":{"key4":18.34}}
一些評論:
- 我沒有測試速度這個方法,但是從我收集通過閱讀一些條目是使用正則表達式比
eval()
更快
- 對於我的應用程序,我限制名稱ar e允許使用
([A-Za-z_$\.][A-Za-z0-9_ \-\.$]*)
作爲我的'寬鬆'版JSON解析器。如果你想允許更多的字符名稱(你可以這樣做,仍然有效),你可以改爲使用([^'":]+)
來表示除雙引號或單引號或冒號以外的任何內容。這裏有各種各樣的東西,所以要小心。
- 一個缺點是這種方法實際上改變了原來的傳入數據(但我認爲這就是你想要的?)。你可以編程來緩解這個問題 - 取決於你的需求和可用的資源。
希望這會有所幫助。 -John L.
您可以顯示服務實際返回的內容嗎?是的,如果整個字符串被雙引號包圍,它仍然是無效的JSON。 –
另外,您是否可以修復該服務? –
您可以假設會返回以下內容:'「{」foo「:」bar「}」'。我用'正則表達式'很糟糕。你知道這會如何治癒嗎? –