我有一个请求参数字符串,它总是会像我这样来到我的服务器:
str1=wordA&str2=wordB&desc3=&int=0
等
此处的捕获是名称为desc3
的参数,可能有也可能没有带有数据的参数,正如我在此处所示,没有数据。我尝试做的是使用正则表达式来提取与str1=word
右侧匹配的字符串,同时还能够指定左侧的内容。例如,我可能只想要str1
参数,或者我只想要desc
参数。其中每一个都是独立的正则表达式。例如,str1
正则表达式将与desc3
正则表达式分开。我对使用正则表达式非常陌生,无论我做什么,我都无法得到结果。
答案 0 :(得分:1)
假设你有这个:
String your = "str1=wordA&str2=wordB&desc3=&int=0"
现在你做:
String[] split = your.split("&");
现在split
看起来像这样:
["str1=wordA", "str2=wordB", "desc3=", "int=0"
现在,如果您想让我们说第二个参数,您可以:
String[] secondParameter = split[1].split("=");
现在secondParameter[0]
是“str2”而secondParameter[1]
是“wordB”。如果你想得到desc3
:
String[] descParam = split[2].split("=");
String name = descParam[0];
String value = "";
if(descParam.length > 1)
value = descParam[1];
else
value = "Parameter desc3 has no value specified";
我希望这会有所帮助。这个代码有点不言自明,split只需要你的字符串并用你指定为参数的正则表达式“除以”它并返回一个数组。
答案 1 :(得分:1)
有时正则表达式不是正确的方法。我会尝试字符串拆分方法:
String testString = "str1=wordA&str2=wordB&desc3=&int=0";
Map<String, String> mapOfParams = Arrays.stream(testString.split("&"))
.collect(Collectors.toMap(s -> s.split("=")[0],
s -> s.split("=").length > 1 ? s.split("=")[1] : ""));
这将为您提供一个空值为空字符串的地图。
答案 2 :(得分:1)
这应该有效:
String desc3 = input.replaceAll(".*desc3=([^&]*).*", "$1");
desc3
是您想要的值的任何参数。
这匹配整个输入,但是捕获值并通过反向引用将其返回到替换中。
要获得全部,首先在"&"
上拆分,然后在"="
上拆分每一个,然后将它们收集到地图中:
Map<String, String> pairs = Arrays.stream(input.split("&"))
.map(s -> s.split("=", -1)) // Note the -1!
.collect(Collectors.toMap(a -> a[0], a -> a[1]));
请注意必须如何对第二个拆分使用负第二个参数,这会强制拆分不丢弃尾随空白元素。如果没有它,在"desc3="
上分割"="
只会导致["desc3"]
,但-1
会导致"desc3", ""]