Java 解析带有分隔符的字符串并将其加载到映射中?

Java 解析带有分隔符的字符串并将其加载到映射中?,java,regex,string,split,guava,Java,Regex,String,Split,Guava,我有以下字符串,格式为key1=value1,key2=value2,我需要将其加载到映射(map)中,作为key=value,所以我需要在逗号上拆分,,然后加载cossn作为键和0其值 String payload = "cossn=0, abc=hello/=world, Agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/53

我有以下字符串,格式为
key1=value1,key2=value2
,我需要将其加载到映射
(map)
中,作为
key=value
,所以我需要在逗号上拆分
,然后加载
cossn
作为键和
0
其值

String payload = "cossn=0, abc=hello/=world, Agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36";

HashMap<String, String> holder = new HashMap();
String[] keyVals = payload.split(", ");
for(String keyVal:keyVals) {
  String[] parts = keyVal.split("=",2);
  holder.put(parts[0], parts[1]);
}   

鉴于您无法控制有效负载,您需要采取措施使“非法逗号”与您的“,”正则表达式不匹配

吸血鬼提供了一个伟大的正则表达式。由于我已经走上了手动解析的道路,我将在下面提供一个非正则表达式的解决方案

另一种解决方案是通过逐个字符迭代并保存子字符串,手动查找解析/拆分点。跟踪“最后一个逗号空间”,直到到达“下一个等于”,以确定是否在该逗号空间上拆分

这里有一些代码演示了我要解释的内容

import java.util.Arrays;

public class ParseTest {

    static String payload = "cossn=0, abc=hello/=world, Agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36";

    public static void main(String[] args) {
        int lastCommaSpace = -2;
        int beginIndex = 0;

        // Iterate over string
        // We are looking for comma-space pairs so we stop one short of end of
        // string
        for (int i = 0; i < payload.length() - 1; i++) {
            if (payload.charAt(i) == ',' && payload.charAt(i + 1) == ' ') {
                // This is the point we want to split at
                lastCommaSpace = i;
            }
            if (payload.charAt(i) == '=' && lastCommaSpace != beginIndex - 2) {
                // We've found the next equals, split at the last comma we saw
                String pairToSplit = payload.substring(beginIndex, lastCommaSpace);
                System.out.println("Split and add this pair:" + Arrays.toString(pairToSplit.split("=", 2)));
                beginIndex = lastCommaSpace + 2;
            }
        }
        // We got to the end, split the last one
        String pairToSplit = payload.substring(beginIndex, payload.length());
        System.out.println("Split and add this pair:" + Arrays.toString(pairToSplit.split("=", 2)));
    }

}
导入java.util.array;
公共类解析测试{
静态字符串payload=“cossn=0,abc=hello/=world,Agent=Mozilla/5.0(windowsnt 6.1;WOW64)AppleWebKit/537.36(KHTML,像Gecko)Chrome/50.0.2661.102 Safari/537.36”;
公共静态void main(字符串[]args){
int lastCommaSpace=-2;
int beginIndex=0;
//遍历字符串
//我们正在寻找逗号-空格对,所以我们只需在结尾处少选一个
//串
对于(int i=0;i
鉴于您无法控制有效负载,您需要采取措施使“非法逗号”与您的“,”正则表达式不匹配

吸血鬼提供了一个伟大的正则表达式。由于我已经走上了手动解析的道路,我将在下面提供一个非正则表达式的解决方案

另一种解决方案是通过逐个字符迭代并保存子字符串,手动查找解析/拆分点。跟踪“最后一个逗号空间”,直到到达“下一个等于”,以确定是否在该逗号空间上拆分

这里有一些代码演示了我要解释的内容

import java.util.Arrays;

public class ParseTest {

    static String payload = "cossn=0, abc=hello/=world, Agent=Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36";

    public static void main(String[] args) {
        int lastCommaSpace = -2;
        int beginIndex = 0;

        // Iterate over string
        // We are looking for comma-space pairs so we stop one short of end of
        // string
        for (int i = 0; i < payload.length() - 1; i++) {
            if (payload.charAt(i) == ',' && payload.charAt(i + 1) == ' ') {
                // This is the point we want to split at
                lastCommaSpace = i;
            }
            if (payload.charAt(i) == '=' && lastCommaSpace != beginIndex - 2) {
                // We've found the next equals, split at the last comma we saw
                String pairToSplit = payload.substring(beginIndex, lastCommaSpace);
                System.out.println("Split and add this pair:" + Arrays.toString(pairToSplit.split("=", 2)));
                beginIndex = lastCommaSpace + 2;
            }
        }
        // We got to the end, split the last one
        String pairToSplit = payload.substring(beginIndex, payload.length());
        System.out.println("Split and add this pair:" + Arrays.toString(pairToSplit.split("=", 2)));
    }

}
导入java.util.array;
公共类解析测试{
静态字符串payload=“cossn=0,abc=hello/=world,Agent=Mozilla/5.0(windowsnt 6.1;WOW64)AppleWebKit/537.36(KHTML,像Gecko)Chrome/50.0.2661.102 Safari/537.36”;
公共静态void main(字符串[]args){
int lastCommaSpace=-2;
int beginIndex=0;
//遍历字符串
//我们正在寻找逗号-空格对,所以我们只需在结尾处少选一个
//串
对于(int i=0;i
正如您所说,您的键只包含字母数字,以下可能是拆分的好方法:

payload.split("\\s*,\\s*(?=[a-zA-Z0-9_]+\\s*=|$)");

它将在可能的空格框逗号上拆分,逗号后跟字符串或字母数字键、可选空格和等号。

正如您所说,您的键只包含字母数字,以下可能是拆分的好方法:

payload.split("\\s*,\\s*(?=[a-zA-Z0-9_]+\\s*=|$)");

它将在可能的空格框逗号上拆分,后跟字符串的结尾或字母数字键、可选空格和等号。

是否总是有4个逗号?不,这只是一个示例字符串。一般来说,它是一个很长的字符串,内容在大多数情况下都会发生变化。你能定义输入的格式吗?这是固定的吗?这是固定的,我对此没有任何控制权。你将不得不进行一些奇特的解析,以便只在等号前面加逗号。您对输入字符串/有效负载有什么控制?似乎您需要比使用逗号分隔的字符串更好地包装它。我建议使用JSON,它是为这样的事情设计的。总是有4个逗号吗?不,这只是一个示例字符串。一般来说,它是一个很长的字符串,内容在大多数情况下都会发生变化。你能定义输入的格式吗?这是固定的吗?这是固定的,我对此没有任何控制权。你将不得不进行一些奇特的解析,以便只在等号前面加逗号。您对输入字符串/有效负载有什么控制?似乎您需要比使用逗号分隔的字符串更好地包装它。我建议使用JSON,它是专门设计的