【问题标题】:Regular expression ^\\Q & \\E [duplicate]正则表达式 ^\\Q & \\E [重复]
【发布时间】:2015-08-26 21:59:54
【问题描述】:

我的应用程序中有以下代码:

private String getRequestPath(HttpServletRequest req) {
        String path = req.getRequestURI();
        path = path.replaceFirst( "^\\Q" + req.getContextPath() + "\\E", "");
        path = URLDecoder.decode(path);
        System.out.println("req.getRequestURI()="+req.getRequestURI());
        System.out.println("path="+path);
        return path;
    }

当我尝试访问此方法所属的 servlet 时,我可以在输出中看到以下消息:

req.getRequestURI()=/MyApp/test
path=/test

^\\Q\\E 在正则表达式中的工作原理。

【问题讨论】:

  • 你不应该那样使用它们。改用Pattern.quote - 更安全

标签: java regex


【解决方案1】:

\Q\E 分别是正则表达式文字中文字字符串的开头和结尾;他们指示正则表达式引擎不要将这两个“标记”之间的文本解释为正则表达式。

例如,为了匹配两颗星,你可以在你的正则表达式中加入这个:

\Q**\E

这将匹配两个文字星,而不是尝试将它们解释为“零个或多个”量词。

另一个更便携的解决方案是使用Pattern.quote

path = path.replaceFirst(Pattern.quote(req.getContextPath()), "");

【讨论】:

    【解决方案2】:

    \Q\E 分隔符用于引用文字。

    来自documentation

    \Q

    没有,但引用所有字符直到 \E

    \E

    什么都没有,只是结束由 \Q 开始的引用

    【讨论】:

      【解决方案3】:

      在正则表达式中,\Q 和 \E 之间的所有字符都被转义

      所以.. 当您有一个要匹配的字符串并且如果它包含特殊的正则表达式字符时,您可以将该字符串放入\Q\E 中以逐字匹配它们。

      【讨论】:

        猜你喜欢
        • 2011-01-23
        • 2018-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多