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

时间:2014-05-16 13:13:17

标签: java string split

遇到我有java字符串的问题:

String aString="name==p==?header=hello?aname=?????lname=lastname";

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

结果应该是键/值对:

name = "=p=="
header = "hello"
aname = "????"
lname = "lastname"

问题是aname和lname成为:

name = ""
lname = "????lname=lastname"

我的代码只需按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...
 }

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

4 个答案:

答案 0 :(得分:5)

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

String[] pairs = aString.split("\\?(?!\\?)");

正则表达式意味着&#34; a?没有后跟一个?&#34;,它给出了:

[name==p==, header=hello, aname=????, lname=lastname]

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

String[] split = pair.split("=", 2); // max 2 parts

全部放在一起:

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]);
}

输出:

name is =p==
header is hello
aname is ????
lname is lastname

答案 1 :(得分:1)

您可以尝试这样

String[] vals = "Hello??Man?HowAreYou????".split("\\?+");
System.out.println(vals[0]+vals[1]+vals[2]);

输出

HelloManHowAreYou

但正如aname=?????你希望得到的那样,你可以取代它 ????? 五个问题标记其他符号并在分割后替换回?????

String processed="Hello????Good? ? ....???".replace("????","*");

<强>输出

Hello*Good? ? ....???

而不是使用split ?

答案 2 :(得分:0)

这是代码,你正在寻找。

使用Split和HashMap实现。

经过测试和执行。

import java.util.HashMap;
import java.util.Map;


    public class Sample {

        public static void main(String[] args) {
            // TODO Auto-generated method stub


    //      String[] vals = "Hello??Man?HowAreYou????".split("\\?+");
    //      System.out.println(vals[0]+vals[1]+vals[2]);

            String query="name==p==?header=hello?aname=?????lname=lastname";
               String[] params = query.split("\\?");  
                Map<String, String> map = new HashMap<String, String>();  
                for (String param : params)  
                {  
                    String name = param.split("=")[0];  
                    String value = param.substring(name.length(),param.length());  
                    map.put(name, value);  
                    System.out.println(name);
                    if(name.equals("")){
                        value+="?";
                    }
                    System.out.println(value.replaceAll(" ", ""));
                }  

        }

    }

答案 3 :(得分:0)

我假设您正在解析URL。正确的方法是对?&=等所有特殊字符进行编码,这些字符是值或名称。

更好的解决方案:编码字符

String name = "=p==";
String aname = "aname=????";
String lname = "lastname";
String url = "name=" + URLEncoder.encode(name, "UTF-8") +
             "?aname=" + URLEncoder.encode(aname, "UTF-8") +
             "?lname=" + URLEncoder.encode(lname, "UTF-8");

之后你会有这样的事情:

name=&#61;p&#61;&#61;?aname=&#63;&#63;&#63;&#63;?lname=lastname

这可以轻松拆分和解码。

其他解决方案:输入解析错误

如果你坚持,这也有效。你可以使用正则表达式:

Pattern pattern = Pattern.compile("(\\w+?)=(\\S+?\\?+)");
Matcher m = pattern.matcher(query + "?");
while (m.find()) {
    String key = m.group(1);
    String value = m.group(2);
    value = value.substring(0, value.length() - 1);
    System.out.println(key + " = " +value);
}