【问题标题】:Match non null words preceded by certain strings only仅匹配某些字符串前面的非空单词
【发布时间】:2016-09-19 18:35:29
【问题描述】:

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

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

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

【问题讨论】:

  • 问题有点不清楚。您应该展示更多具有预期输出的示例。

标签: java regex string http-request-parameters


【解决方案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", ""]

【讨论】:

  • 这行得通,尽管它只有在我手动输入我需要的每个参数时才有效。我正在寻找一种方便的方法来获取所有 str 参数值或所有 desc 参数值。
  • @gd 这就是你所说的你想要的:每一个都将是一个单独的正则表达式
  • 对不起,我应该澄清一下。正则表达式将按类别分开。即str 参数名称的一个正则表达式,int 参数名称的一个正则表达式,desc 参数名称的一个正则表达式,等等。
  • @gd 查看新的金锤解决方案
【解决方案2】:

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

    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。

【讨论】:

    【解决方案3】:

    假设你有这个:

    String your = "str1=wordA&amp;str2=wordB&amp;desc3=&amp;int=0"

    现在你可以这样做了:

    String[] split = your.split("&amp;");

    现在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 只需将您的字符串通过您指定为参数的正则表达式“分割”并返回一个数组。

    【讨论】:

    • 我实际上已经这样做了,一直到你的最后两行。但问题在于这需要扩展,这意味着如果对传入的参数进行更改,我将不必手动调整我正在访问的索引。这就是为什么我试图只在左侧匹配。例如,现在只有两个参数,名称为 str1str2,但如果这个列表增加到 15 个,我将不得不手动访问每个参数并提前知道哪些属于 str 和不是descint
    • 您可以遍历它并检查,或者将其放入以参数名称为键的映射中,有很多选项。哦,看看下面的答案,它显示了如何立即将其放入地图中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多