仅匹配以特定字符串开头的非空词

Match non null words preceded by certain strings only

我有一个请求参数字符串,它将始终像这样到达我的服务器:

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

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

假设你有这个:

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 只获取您的字符串,然后 'divides' 通过您指定为参数的正则表达式和 return 数组。

有时正则表达式不是正确的方法。我会尝试字符串拆分方法:

    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] : ""));

这将为您提供一个将空值作为空字符串的 Map。

这应该有效:

String desc3 = input.replaceAll(".*desc3=([^&]*).*", "");

其中 desc3 是您想要其值的任何参数。

这与整个输入匹配,但捕获值并通过反向引用在替换中returns它。


为了全部获取,首先在 "&" 上拆分,然后在 "=" 上拆分每个,然后将它们收集到地图中:

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", ""]