尝试构建在负字符集中使用负向前瞻的RegEx

时间:2016-12-18 01:52:13

标签: java regex

我正在尝试分解网址查询部分的参数。这是我的RegEx:

private static final String PARAMS_PATTERN = "([^\\?&#=]*)=([^&#]*)";

这是我迭代匹配的代码:

Map<String, String> queryMap = new HashMap<String, String>();
Matcher paramsMatcher = Pattern.compile(PARAMS_PATTERN).matcher(this.query);
while (paramsMatcher.find())  
{
    queryMap.put(paramsMatcher.group(1), paramsMatcher.group(2));
}

除了包含另一个URL作为参数的URL的情况之外,它的工作正常,其中还包含查询参数,其中&符号已被HTML转义为:

&amp;

示例:

http://www.example.com/path/to/something?param1=foo&param2=bar&url=http://www.example.com/path/to/something?param1=foo&amp;param2=bar

我意识到网址无效(不是在浪费15分钟之前),但我很好奇究竟什么样的正则表达式会将最后一个参数作为单个组捕获。

我尝试在否定字符集中构建负向前瞻,但这不起作用。我的尝试:

([^\\?&(?!(?:apos|quot|lt|gt|amp);|#)#=]*)=([^&(?!(?:apos|quot|lt|gt|amp);|#)#]*)

我无法找到关于字符集中是否实际允许这样的预测的答案,但RegEx根据RegexrRegexPlanet不起作用。任何人都能满足我的好奇心吗?

1 个答案:

答案 0 :(得分:0)

  

关于字符集内是否允许这样的超前查找,我一直找不到答案

当然不是,因为正如术语所暗示的,字符集由字符组成,而不是规则的[lookahead]表达式。但是,在这里我们不需要像否定字符集中的否定先行一样,因为在双重否定中很常见,它们相互抵消,并且可以用肯定的构造代替。在目前的情况下,我们需要匹配的参数值应更少,但要更多,因此我们可以通过将子模式[^&#]替换为([^&#]|&(apos|quot|lt|gt|amp);),即i来添加其他选择。 e。使用:

private static final String PARAMS_PATTERN = "([^\\?&#=]*)=(([^&#]|&(apos|quot|lt|gt|amp);)*)";