【问题标题】:Replace querystring attribute value in java using regex使用正则表达式替换java中的查询字符串属性值
【发布时间】:2013-12-09 13:52:17
【问题描述】:

我想替换查询字符串值,但它会产生一些问题:

问题1:替换后去掉“&”符号

String queryString = "?pid=1&name=Dell&cid=25";
String nQueryString=queryString.replaceAll("(?<=[?&;])pid=.*?($|[&;])","pid=23");
System.out.println(nQueryString);          

上面例子的输出 ?pid=23name=Dell&amp;cid=25

你可以看到它删除了pid之后的“&”

问题 2:如果我删除了“?”,它就不起作用了来自queryString 变量的符号。

String queryString = "pid=1&name=Dell&cid=25";
String nQueryString=queryString.replaceAll("(?<=[?&;])pid=.*?($|[&;])","pid=23");
System.out.println(nQueryString);          

上面例子的输出 ?pid=1&amp;name=Dell&amp;cid=25

我们可以说正则表达式不起作用,所以任何人都可以建议我更好的正则表达式,它完全满足我的要求。

【问题讨论】:

    标签: java regex query-string


    【解决方案1】:
    queryString.replaceAll("(?<=[?&;])pid=.*?(?=[&;])", "pid=23")
    

    不同之处在于我使用的是正向前瞻:(?=[&amp;;]),它的长度为零,使其具有原子性,实际上并没有通过replaceAll() 包含在替换中,就像您原来的正向后视一样没有被替换。

    或者,我们可以匹配直到找到&amp;;,但不包含在替换中,即:

    queryString.replaceAll("(?<=[?&;])pid=[^&;]*", "pid=23")
    

    [^&amp;;] : ^ 否定以下内容:&amp;;,因此 [^&amp;;]* 将匹配,直到遇到 ;&amp;

    你的不起作用,因为($|[&amp;;]) 是一个非原子组,特别是一个捕获组,因此包含在替换中。注意:非捕获组(?:$|[&amp;;]) 在这里也会失败。

    最后一点,您对?&amp;; 使用了正向后视,因此通过删除?,它将不再匹配,这是有道理的。

    【讨论】:

    • 是的@Steve你是对的,但是当我试图用空格替换相同的queryString时,它不会删除“&”符号。 queryString.replaceAll("(?&lt;=[?&amp;;])pid=[^&amp;]*","") 会给?&amp;name=Dell&amp;cid=25
    • 哦,是的,我只是想替换 queryString 值,但我只是尝试替换属性。如果相同的正则表达式对我有用,我会更好,这就是我尝试和评论的原因。谢谢@Steve,你的回答对我很有用。
    【解决方案2】:

    改用regex

    String nQueryString = queryString.replaceAll("(?<=[?&;])pid=[^&]*", "pid=23");
    //=> ?pid=23&name=Dell&cid=25
    

    这里[^&amp;]* 被称为negation matching pattern,它将匹配查询字符串值,直到找到&amp;,否则找到字符串结尾,从而使查询字符串的其余部分不受影响。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 2019-12-02
      • 1970-01-01
      相关资源
      最近更新 更多