仅匹配以特定字符串开头的非空词
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]));
请注意,您必须如何对第二个拆分使用负的第二个参数,这会强制拆分不丢弃尾随的空白元素。没有它,在 "="
上拆分 "desc3="
只会得到 ["desc3"]
,但是如果使用 -1
,您会得到 "desc3", ""]
我有一个请求参数字符串,它将始终像这样到达我的服务器:
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]));
请注意,您必须如何对第二个拆分使用负的第二个参数,这会强制拆分不丢弃尾随的空白元素。没有它,在 "="
上拆分 "desc3="
只会得到 ["desc3"]
,但是如果使用 -1
,您会得到 "desc3", ""]