我正在尝试分解 URL 查询部分的参数。这是我的正则表达式:
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 之外,该方法工作正常,该 URL 还包含查询参数,其中 & 符号已被 HTML 转义为:
&
示例:
http://www.example.com/path/to/something?param1=foo¶m2=bar&url=http://www.example.com/path/to/something?param1=foo&param2=bar
我意识到该 URL 无效(浪费了 15 分钟),但我很好奇什么样的正则表达式实际上会将最后一个参数捕获为单个组。
我尝试在负字符集中构建负前瞻,但这不起作用。我的尝试:
([^\\?&(?!(?:apos|quot|lt|gt|amp);|#)#=]*)=([^&(?!(?:apos|quot|lt|gt|amp);|#)#]*)
我一直无法找到关于字符集中是否确实允许这样的前瞻的答案,但是根据Regexr,正则表达式不起作用和 RegexPlanet 。有谁能满足我的好奇心吗?
最佳答案
I haven't been able to find an answer as to whether or not lookahead like this within a character set is actually permitted
当然不是,因为顾名思义,字符集由字符组成,而不是常规的 [lookahead] 表达式。然而,我们不需要像这里的负字符集中的负向前看这样的东西 - 因为双重否定很常见,它们相互抵消并且可以被正构造替换。在当前的情况下,我们需要匹配的参数值不是更少,而是更多,因此我们可以通过将子模式 [^]
替换为 ([^ ]|&(apos|quot|lt|gt|amp);)
,i。 e.使用:
private static final String PARAMS_PATTERN = "([^\\?&#=]*)=(([^&#]|&(apos|quot|lt|gt|amp);)*)";
关于java - 尝试构建在负字符集中使用负前瞻的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41204791/