我想替换查询字符串值,但它会产生一些问题:
问题1 :删除“&”替换后的符号
String queryString = "?pid=1&name=Dell&cid=25";
String nQueryString=queryString.replaceAll("(?<=[?&;])pid=.*?($|[&;])","pid=23");
System.out.println(nQueryString);
以上示例的输出
?pid=23name=Dell&cid=25
你可以看到它删除了“&amp;”在pid
之后
问题2 :如果删除了“?”,它就无法正常工作来自queryString
变量的符号。
String queryString = "pid=1&name=Dell&cid=25";
String nQueryString=queryString.replaceAll("(?<=[?&;])pid=.*?($|[&;])","pid=23");
System.out.println(nQueryString);
以上示例的输出
?pid=1&name=Dell&cid=25
我们可以说正则表达式不起作用,所以任何人都可以建议我更好的正则表达式,它完全符合我的要求。
答案 0 :(得分:1)
queryString.replaceAll("(?<=[?&;])pid=.*?(?=[&;])", "pid=23")
区别在于我正在使用正向前瞻:(?=[&;])
,它是零长度,使其成为原子,并且实际上并不包含在替换中replaceAll()
,就像你的原始版本一样积极看待不会被取代。
或者,我们可以匹配,直到找到&
或;
,但不包含在替换中,即:
queryString.replaceAll("(?<=[?&;])pid=[^&;]*", "pid=23")
[^&;]
:^
否定以下内容:&;
,因此[^&;]*
将匹配,直到遇到;
或&
。
您的工作不起作用,因为($|[&;])
是非原子组,特别是捕获组,因此包含在替换中。注意:非捕获组(?:$|[&;])
也会失败。
至于最后一点,您正在使用?
,&
和;
的正面观察,因此删除?
时,它将不会更长的匹配,这是有道理的。
答案 1 :(得分:0)
改为使用此regex
:
String nQueryString = queryString.replaceAll("(?<=[?&;])pid=[^&]*", "pid=23");
//=> ?pid=23&name=Dell&cid=25
此处[^&]*
称为negation matching pattern
,它将匹配查询字符串值,直到找到&
或者找到字符串的结尾,从而使查询字符串的其余部分不受影响。< / p>