匹配仅以某些字符串开头的非空字

时间:2016-09-19 18:35:30

标签: java regex string http-request-parameters

我有一个请求参数字符串,它总是会像我这样来到我的服务器:

str1=wordA&str2=wordB&desc3=&int=0

此处的捕获是名称为desc3的参数,可能有也可能没有带有数据的参数,正如我在此处所示,没有数据。我尝试做的是使用正则表达式来提取与str1=word右侧匹配的字符串,同时还能够指定左侧的内容。例如,我可能只想要str1参数,或者我只想要desc参数。其中每一个都是独立的正则表达式。例如,str1正则表达式将与desc3正则表达式分开。我对使用正则表达式非常陌生,无论我做什么,我都无法得到结果。

3 个答案:

答案 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]));

Try it online!

请注意必须如何对第二个拆分使用负第二个参数,这会强制拆分不丢弃尾随空白元素。如果没有它,在"desc3="上分割"="只会导致["desc3"],但-1会导致"desc3", ""]