java - 尝试构建在负字符集中使用负前瞻的正则表达式

标签 java regex

我正在尝试分解 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 转义为:

&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

我意识到该 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/

相关文章:

java - G1(垃圾收集器)什么时候开始运行,它首先收集哪个内存区域? java 8 上有哪些新的 GC 更新?

java - 如何将我创建的以下 Java 代码写入驱动程序并调用方法/类?

regex - 正则表达式: zero or more occurrences of optional character/

关键字的正则表达式

javascript - 正则表达式检查字符串是否仅包含数字

regex - Laravel 5 验证正则表达式以实现精确的字符串匹配

java - 使用selenium java的字体颜色

java - Autowiring map 未按预期工作

java - 使用具有相同布局的二维数组绘制迷宫

C KERN_INVALID_ADDRESS 在 regnexec()