使用regex替换java中的querystring属性值

时间:2013-12-09 13:52:18

标签: java regex query-string

我想替换查询字符串值,但它会产生一些问题:

问题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

我们可以说正则表达式不起作用,所以任何人都可以建议我更好的正则表达式,它完全符合我的要求。

2 个答案:

答案 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>