我想替换查询字符串值,但它会产生一些问题:
问题 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
你可以看到它删除了 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
我们可以说正则表达式不起作用,所以任何人都可以建议我更好的正则表达式,它完全满足我的要求。
最佳答案
queryString.replaceAll("(?<=[?&;])pid=.*?(?=[&;])", "pid=23")
区别在于我使用的是正向先行:(?=[&;])
,它是零长度的,使其成为原子的,并且实际上不包含在替换中replaceAll()
,就像你原来的 positive-lookbehind 没有被替换一样。
或者,我们可以匹配直到找到 &
或 ;
,但不包括在替换中,即:
queryString.replaceAll("(?<=[?&;])pid=[^&;]*", "pid=23")
[^&;]
:^
否定以下内容:&;
,所以 [^&;]*
将匹配直到遇到 ;
或 &
。
你的不起作用,因为 ($|[&;])
是一个非原子组,特别是一个捕获组,因此包含在替换中。注意:非捕获组 (?:$|[&;])
也会在这里失败。
最后要注意的是,您对 ?
、&
和 ;
使用了正向回顾,因此通过删除?
,将不再匹配,这是有道理的。
关于java - 使用正则表达式替换java中的querystring属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20472289/