在 Java 中替换 QueryString 中的参数

Replace a Param in QueryString in Java

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

制作一个视图模型。

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。在代码片段下方)。

String url = "token=1234235asdjaklj231k209a&name=sam&firname=Mahan";
url = url.replaceFirst("\btoken=.*?(&|$)", "token=new_value");
System.out.println(url);
url = "param1=value&token=1234235asdjaklj231k209a";
url = url.replaceFirst("\btoken=.*?(&|$)", "token=new_value");
System.out.println(url);

首先要考虑的边缘情况是您的 token 可能是查询字符串中的最后一个参数。为了涵盖这种情况,我们应该检查以 结尾的 token=... 或者 一个琥珀码 & 或字符串的结尾。但是如果我们不使用 lookahead,而是消耗那个 ambersand,我们还必须将它添加回替换中。 @DodgyCodeException 在他下面的评论中正确捕获的另一个边缘情况是 another 查询参数恰好在 end 中12=]。为了确保我们真正匹配我们的 token 参数,我们可以在正则表达式中用单词边界作为它的前缀,即使用 \btoken=... 来引用它。

输出:

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

Spring 有一个实用程序可以优雅地处理这个需求。 Apache httpcomponents 也是如此。下面是一个 spring 示例。

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


public class Whosebug {

  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);
    }
  }
}

不要害怕在项目中添加依赖项,这总比重新发明轮子好。