我通过说 request.queryString() 从 url 得到一个查询字符串 -
supplyId=123456789b&search=true
我想用新值替换“supplyId”的值。“supplyId”可以出现在查询字符串中的任何位置。可能的正则表达式是什么?
我实际上不会为此使用正则表达式,而是使用字符串操作。在 URL 中搜索“supplyId=”的位置,然后抓取所有内容,直到字符串结尾或“&”,以先到者为准。
如果您必须使用正则表达式,请尝试以下方法之一:
(?<=supplyId=)[^&]+
supplyId=([^&]+)
确保关闭区分大小写。如果您使用第二种模式,您想要的值将在捕获组 1 中。
我认为你应该能够做这样的事情:
String queryString = "supplyId=123456789b&search=true";
String anyStringIlike = "someValueIlike";
String newQueryString = queryString.replaceAll("supplyId=[^&]+","supplyId=" + anyStringIlike);
System.out.println(queryString);
System.out.println(newQueryString);
这应该打印:
供应ID=123456789b&search=true
supplyId=someValueIlike&search=true
在 perl 中你可以做这样的事情。
perl -le '@m = ( "garbare=i123123123asdlfkjsaf&supplyId=123456789b&search=true" =~ /supplyId=(\d+\w+)&/g ); 为@m 打印
public static String updateQueryString (String queryString, String name, String value) {
if (queryString != null) {
queryString = queryString.replaceAll(name + "=.*?($|&)", "").replaceFirst("&$", "");
}
return addParameter(queryString, name, value);
}
public static String addParameter(queryString, name, value) {
return StringUtils.isEmpty(queryString) ? (name + "=" + value) : (queryString + "&" + name + "=" + value);
}
你这样称呼:updateQueryString("supplyId=123456789b&search=true", "supplyId", "newValue");
输出: search=true&supplyId=newValue
public class TestQueryStringValReplace {
public static String replace(String queryString, String propName, String newVal) {
return queryString.replaceAll(propName+"=[^&]+", propName+"=" + newVal);
}
public static void main(String[] args) {
Assert.assertEquals("supplyId=newVal&search=true", replace("supplyId=oldVal&search=true", "supplyId","newVal"));
Assert.assertEquals("supplyId=newVal", replace("supplyId=oldVal", "supplyId","newVal"));
Assert.assertEquals("search=true&supplyId=newVal&3rdprop=val", replace("search=true&supplyId=oldVal&3rdprop=val", "supplyId","newVal"));
}
}