JSON文字列があります:
{name:"X",age:{dob:"DD MMM",year:YYYY}}
Hashtable<String, String>
次のようなペアが必要です。
name: "X"
age: {dob:"DD MMM",year:YYYY}
私は現在使用しています
string.substring(1,string.length() - 2).split(",");
正規表現を使用してこれを達成するにはどうすればよいですか?
JSON テキストがサンプル テキストに示されているレベルを超えてネストされていない場合、この式は次のようになります。
(?:,|\{)?([^:]*):("[^"]*"|\{[^}]*\}|[^},]*)
サンプルテキスト
{name:"X",age:{dob:"DD MMM",year:YYYY}}
コード
String sourcestring = "source string to match with pattern";
Pattern re = Pattern.compile("(?:,|\\{)?([^:]*):(\"[^\"]*\"|\\{[^}]*\\}|[^},]*)",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL);
Matcher m = re.matcher(sourcestring);
マッチ
[0][0] = {name:"X"
[0][1] = name
[0][2] = "X"
[1][0] = ,age:{dob:"DD MMM",year:YYYY}
[1][1] = age
[1][2] = {dob:"DD MMM",year:YYYY}
4行ですべてを行う方法は次のとおりです。
Map<String, String> map = new HashMap<String, String>();
String[] parts = json.replaceAll("^\\{|\\}$","").split("\"?(:|,)(?![^\\{]*\\})\"?");
for (int i = 0; i < parts.length -1; i+=2)
map.put(parts[i], parts[i+1]);
これは次のように機能します。
ここにいくつかのテストコードがあります:
public static void main(String[] args) throws Exception {
String json = "{name:\"X\",age:{dob:\"DD MMM\",year:YYYY}}";
Map<String, String> map = new HashMap<String, String>();
String[] parts = json.replaceAll("^\\{|\\}$","").split("\"?(:|,)(?![^\\{]*\\})\"?");
for (int i = 0; i < parts.length -1; i+=2)
map.put(parts[i], parts[i+1]);
System.out.println(map.size() + " entries: " + map);
}
出力:
2 entries: {age={dob:"DD MMM",year:YYYY}, name=X}
これは再帰がサポートされている場合にのみ可能ですが、残念ながら Java にはありません。
再帰がサポートされている場合、次の正規表現がそれを行います。(?=({(?>[^{}]|(?1))+}))
ライブデモ: http://regex101.com/r/pH7rV8