遇到我有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...
}
任何想法如何允许我的名字?
免责声明:是的,我的正则表达式技能非常低,所以我不知道是否可以通过正则表达式来完成。
答案 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==p==?aname=?????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);
}