拆分包含问号和等号的字符串的最佳方法

Mul*_*xor 3 java string split

有一个我有一个java字符串的问题:

String aString="name==p==?header=hello?aname=?????lname=lastname";
Run Code Online (Sandbox Code Playgroud)

我需要在问号上分开,然后是等号.

结果应该是键/值对:

name = "=p=="
header = "hello"
aname = "????"
lname = "lastname"
Run Code Online (Sandbox Code Playgroud)

问题是aname和lname成为:

name = ""
lname = "????lname=lastname"
Run Code Online (Sandbox Code Playgroud)

我的代码简单地通过执行分割aString.split("\\?",2)
将返回2个字符串.一个包含键/值对,第二个字符串包含字符串的其余部分.如果我在字符串中找到一个问号,我会对第二个字符串进行递归以进一步分解.

private String split(String aString)
 {
    System.out.println("Split: " + aString);
    String[] vals = aString.split("\\?",2);
    System.out.println("  - Found: " + vals.length);
    for ( int c = 0;c<vals.length;c++ )
       {
        System.out.println("  - "+ c + "| String: [" + vals[c] + "]" );
        if(vals[c].indexOf("?") > 0 )
          {
            split(vals[c]);
           }
        }
    return ""; // For now return nothing...
 }
Run Code Online (Sandbox Code Playgroud)

任何想法我怎么可以允许一个名字?
免责声明:是的,我的正则表达式技能非常低,所以我不知道是否可以通过正则表达式来完成.

Boh*_*ian 5

你可以让正则表达式完成所有繁重的工作,首先将你的字符串分成几对:

String[] pairs = aString.split("\\?(?!\\?)");
Run Code Online (Sandbox Code Playgroud)

那个正则表达式意味着"a?没有后跟?",它给出了:

[name==p==, header=hello, aname=????, lname=lastname]
Run Code Online (Sandbox Code Playgroud)

然后还将结果拆分为名称/值,仅拆分第一个"=":

String[] split = pair.split("=", 2); // max 2 parts
Run Code Online (Sandbox Code Playgroud)

把它们放在一起:

String aString = "name==p==?header=hello?aname=?????lname=lastname";
for (String pair : aString.split("\\?(?!\\?)")) {
    String[] split = pair.split("=", 2);
    System.out.println(split[0] + " is " + split[1]);
}
Run Code Online (Sandbox Code Playgroud)

输出:

name is =p==
header is hello
aname is ????
lname is lastname
Run Code Online (Sandbox Code Playgroud)