2017-03-22 11 views
2

私はJSONにデータを解析しようとしています。結果はどのようにあるべきJavascript Regex - 否定的なlookbehindと先読み

[{ 
    'Id': 1, 
    'FirstName': 'bob', 
    'LastName': '', 
    'Description': 'description can include escaped single quotes: \'.' 
}] 

:データはこのようになります

[{ 
    "Id": 1, 
    "FirstName": "bob", 
    "LastName": "", 
    "Description": "description can include escaped single quotes: \'." 
}] 

ポイントだけではエスケープ引用符を残しながら、二重引用符で、すべてのエスケープされていない単一引用符を交換することです。

エスケープされた一重引用符を無視して、一重引用符を二重引用符に変換する際にすでにうまく動作するregexをJSON用に使用しています。

/((?!\\).{1}|^.{0,0})\'/g 

問題:問題は少し'LastName': ''のために、それが唯一の "第二ませんが...この中にそれを作る際の最初の引用符置き換えることです。"LastName": "'無効JSONで

質問:?どのように私は両方必ず単一引用符を置き換え得ることを確認するために私の正規表現を変更することができ、私は2回連続string.replaceを実行しているように感じるが汚いソリューションです...

+0

データがJavaScriptリテラルの場合は、[JavaScriptパーザ](https://github.com/ternjs/acorn)を使用します。 – Ryan

+1

'.replace(/'([^'\\]*(?:\\,[^'\\]*)*)/ g、 '' $ 1 '')' –

+0

あなたは[この1](https://regex101.com/r/5tWNgh/1)@WiktorStribiżew – revo

答えて

2

私はJavaScript変数にデータを格納し、JSON.stringifyを使用して何を達成するための最善の方法になると思いますやろうとしている。それはあなたのためにエスケープ特殊文字を扱うでしょう、そして、あなたはRegexがより多くのシナリオを扱うように維持する必要はありません。 [{ "ID":1、 "姓": "ボブ"、 "姓": ""、 "説明":」あなたのstrが、この値を持つことになります。この後

obj=[{ 'Id': 1, 'FirstName': 'bob', 'LastName': '', 'Description': 'description can include escaped single quotes: \'.'}] 
 
str=JSON.stringify(obj)
説明にエスケープされた単一引用符を含めることができます: '。 "}]

1

後方参照がjavascriによってサポートされていません。 pt。あなたも肯定的な先読みでそれをすることはできません。全ての前後参照のことを考えずにこれを行うには、より信頼性の高い方法があります:

var str = str = `[{ 
 
    'Id': '', 
 
    'FirstName': 'bo\\\\\\\\'b', 
 
    'LastName': '', 
 
    'Description': 'des\\\\\\'cription can\\\\' include \\\\\\\\'escaped\\'single quotes: \\'.' 
 
}]`; 
 

 
console.log(str.replace(/(\\\\)+(')|\\+'|(')/g, function(match, p1, p2, p3) { 
 
    return p2 ? p1 + '\\"' : (p3 ? '"' : match); 
 
}));

関連する問題