2016-12-31 81 views
3

我有一個很長的字符串,看起來像Java的正則表達式字符串轉換爲有效的JSON字符串

{abc:\"def\", ghi:\"jkl\"} 

我想將其轉換爲有效的JSON字符串像

{\"abc\":\"def\", \"ghi\":\"jkl\"} 

我開始看對字符串對象的replaceAll(String regex, String replacement)方法,但我努力尋找它的正確的正則表達式。

有人可以幫助我這個。

+2

另一種方法是使用寬鬆解析器解析它,例如, Gson有['setLenient()'](https://static.javadoc.io/com.google.code.gson/gson/2.6.2/com/google/gson/stream/JsonReader.html#setLenient-boolean -) 方法。然後將其寫回爲有效的JSON。 – Andreas

+0

你正在使用哪個json依賴關係?更好的選擇是根據正確的格式生成它,不管它是客戶端還是服務器端 –

+0

您可以嘗試通過搜索一系列標識符字符後跟':'來進行替換,但如果冒號存在,則可能會導致失敗在任何值字符串中。其他可能會擊敗你的東西是其中一個值中的引號。有可能想出一個處理所有事情的複雜正則表達式,但在這種情況下,最好編寫自己的詞法分析器來處理輸入中的令牌(比如'{',':',',',標識符,字符串文字)並從中工作。無論如何,過於複雜的正則表達式是不可讀的,並且容易出錯。 – ajb

回答

0

我必須假定「鍵」和「值」只包含 「單詞字符」(\ w),並且它們中沒有空格。

這是我的程序。另請參閱在線評論:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class RegexJson { 

    public static void main(String[] args) { 
     /* 
     * Note that the input string, when expressed in a Java program, need escape 
     * for backslash (\) and double quote ("). If you read directly 
     * from a file then these escapes are not needed 
     */ 
     String input = "{abc:\\\"def\\\", ghi:\\\"jkl\\\"}"; 

     // regex for one pair of key-value pair. Eg: abc:\"edf\" 
     String keyValueRegex = "(?<key>\\w+):(?<value>\\\\\\\"\\w+\\\\\\\")"; 
     // regex for a list of key-value pair, separated by a comma (,) and a space () 
     String pairsRegex = "(?<pairs>(,*\\s*"+keyValueRegex+")+)"; 
     // regex include the open and closing braces ({}) 
     String regex   = "\\{"+pairsRegex+"\\}"; 

     StringBuilder sb = new StringBuilder(); 

     sb.append("{"); 
     Pattern p1 = Pattern.compile(regex); 
     Matcher m1 = p1.matcher(input); 
     while (m1.find()) { 
      String pairs = m1.group("pairs"); 
      Pattern p2 = Pattern.compile(keyValueRegex); 
      Matcher m2 = p2.matcher(pairs); 
      String comma = "";  // first time special 
      while (m2.find()) { 
       String key  = m2.group("key"); 
       String value = m2.group("value"); 
       sb.append(String.format(comma + "\\\"%s\\\":%s", key, value)); 
       comma = ", ";  // second time and onwards 
      } 
     } 
     sb.append("}"); 

     System.out.println("input is: " + input); 
     System.out.println(sb.toString()); 
    } 

} 

打印出這個計劃的是:

input is: {abc:\"def\", ghi:\"jkl\"} 
{\"abc\":\"def\", \"ghi\":\"jkl\"} 
2

在這種特殊情況下,regex應該尋找那些被繼續進行{space一個字,或,和後面沒有"

String str = "{abc:\"def\", ghi:\"jkl\"}"; 
String regex = "(?:[{ ,])(\\w+)(?!\")"; 
System.out.println(str.replaceAll(regex, "\\\"$1\\\"")); 

DEMOregex解釋