替换Java中QueryString中的参数

替换Java中QueryString中的参数,java,string,design-patterns,matcher,Java,String,Design Patterns,Matcher,假设我有一个url参数,比如token=1234235asdjaklj231k209a&name=sam&firname=Mahan 如何用新的令牌替换令牌的值? 我以前用pattern和matcher做过类似的事情,但现在不记得了 但我知道有办法做到这一点 更新:令牌可以包含任何字母,但& 提前感谢制作一个viewModel public class veiwModel(){ String token ; // and get and set for exmample } 如果你有一个jso

假设我有一个url参数,比如
token=1234235asdjaklj231k209a&name=sam&firname=Mahan
如何用新的令牌替换令牌的值? 我以前用pattern和matcher做过类似的事情,但现在不记得了 但我知道有办法做到这一点 更新:令牌可以包含任何字母,但& 提前感谢

制作一个viewModel

public class veiwModel(){ String token ; // and get and set for exmample }
如果你有一个json文本,那么使用Gson

   Gson gson = new Gson();
   yourViewModel = gson.fronJson(jsonText , viewModel.class);
   System.out.println(yourViewModel.getToken());

我们可以考虑做一个简单的正则表达式替换,有几个注意事项(代码片段下面的q.v)。

边缘情况首先考虑的是,您的<代码>令牌< /代码>可能是查询字符串中的最后一个参数。为了涵盖这种情况,我们应该检查是否有

标记=…
以ambersand
&
结尾或字符串结尾。但是,如果我们不使用前瞻,而是使用安伯山,我们还必须将其添加回替代品中。@DodgyCodeException在下面的评论中正确地捕捉到了另一个边缘情况,即有另一个查询参数恰好以
标记
结尾。为了确保我们确实匹配了
标记
参数,我们可以在正则表达式中为其添加单词边界,即使用
\btoken=…
引用它

输出:

token=new_value&name=sam&firname=Mahan
param1=value&token=new_value

Spring有一个util,可以优雅地处理这一需求。ApacheHttpComponents也是如此。下面是一个spring示例

import org.springframework.web.util.UriComponentsBuilder;
import java.net.URI;


public class StackOverflow {

  private static class SO46303058 {
    public static void main(String[] args) {
      final String urlString = "https://subdomain.hostname/path/resource?token=1234235asdjaklj231k209a&name=sam&firname=Mahan";
      final URI uri = UriComponentsBuilder.fromHttpUrl(urlString)
          .replaceQueryParam("token", "abc")
          .build().toUri();
      System.out.println(uri);
    }
  }
}

不要害怕向项目中添加依赖项,这比重新发明轮子要好得多

输出应该是什么样子?@YCF_L使用相同的字符串,但标记的值被替换为新的标记,如token=1234&name=sam&firname=Mahan,例如1234是新的标记,标记包含任何内容,但&我认为这不是regex的工作;java中有经过良好测试的URL抽象。请解释您可以使用的所有情况,以便我们可以帮助您:如果查询参数为“thisisnotateken=gotcha&token=1234abcd&…”@DodgyCodeException,那么在这种情况下,我们应该使用单词边界。你当然对不可靠的代码很敏感:-)谢谢它对我的案例有效,@DodgyCodeException上面提到的案例不会发生在我身上,但是谢谢你提到我很高兴它在你的具体案例中有所帮助,但对于一般用途来说,这是不可靠的-例如,可能有一个
&上面提到的会弄错的地方。解决这个问题的最好方法是使用经过良好测试的URL参数解析库(比如ApacheUrlEncodeDutils——并不是说它经过良好测试,因为Apache是一个如此命名的库,因为它有点不完整,但它是我唯一能找到的库)。然后使用它来拆分为名称-值对列表,更改相应的值,并重新编码为字符串。我之所以对此进行升级,是因为我觉得通常大多数URI/URL内容都应该由此类库处理,而不是手动处理。请注意,我的降级投票者:也就是说,如果出于某种原因,OP确实只有一个查询字符串片段,那么这样一个罐装的库就不起作用了。谢谢,这是一个好消息,我也在使用Spring,它非常有用,而且非常干净
import org.springframework.web.util.UriComponentsBuilder;
import java.net.URI;


public class StackOverflow {

  private static class SO46303058 {
    public static void main(String[] args) {
      final String urlString = "https://subdomain.hostname/path/resource?token=1234235asdjaklj231k209a&name=sam&firname=Mahan";
      final URI uri = UriComponentsBuilder.fromHttpUrl(urlString)
          .replaceQueryParam("token", "abc")
          .build().toUri();
      System.out.println(uri);
    }
  }
}