我在urlrewrite.xml中具有以下配置:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE urlrewrite PUBLIC "-//tuckey.org//DTD UrlRewrite 4.0//EN" "http://www.tuckey.org/res/dtds/urlrewrite4.0.dtd">
<urlrewrite use-query-string="true">
    <rule>
        <from>^(/event/showEventList)(\.{1})(\bhtm\b|\bhtml\b)(\?{0,1})([a-zA-Z0-9-_=&amp;]{0,}+)(#{0,1})([a-zA-Z0-9-_=&amp;]{0,}+)$</from>
        <to type="redirect" last="true">/events$4$5</to>
    </rule>
</urlrewrite>


正则表达式^(/event/showEventList)(\.{1})(\bhtm\b|\bhtml\b)(\?{0,1})([a-zA-Z0-9-_=&amp;]{0,}+)(#{0,1})([a-zA-Z0-9-_=&amp;]{0,}+)$有7个组,它们是:


(/event/showEventList):匹配/ event / showEventList
(\.{1}):与单个点(。)匹配
(\bhtm\b|\bhtml\b):仅匹配htm或html
(\?{0,1}):与问号(?)匹配,该问号可能会出现零或一个
([a-zA-Z0-9-_=&amp;]{0,}+):匹配查询字符串,该字符串可以出现零个或多个
(#{0,1}):匹配可能会出现零或一的井号(#)
([a-zA-Z0-9-_=&amp;]{0,}+):匹配可能出现零个或多个的片段


如果我使用测试URL:/event/showEventList.html?pageNumber=1#key=val测试此配置,则期望重定向的URL为/events?pageNumber=1,但是我得到的是/events?pageNumber=1#key=val

我有一个代码片段对其进行测试,即:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class UrlRewriterRegexTest {

    public static void main(String[] args) {
        String input = "/event/showEventList.html?pageNumber=1#key=val";
        String regex = "^(/event/showEventList)(\\.{1})(\\bhtm\\b|\\bhtml\\b)(\\?{0,1})([a-zA-Z0-9-_=&]{0,}+)(#{0,1})([a-zA-Z0-9-_=&]{0,}+)$";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        System.out.println(matcher.replaceFirst("/events$4$5"));
    }
}


它输出到:/events?pageNumber=1

任何指针都将非常有帮助。

最佳答案

我会简化一下表达式。


转义斜杠,因为它们通常用作正则表达式(\/event\/showEventList)的定界符
删除多余的量词(\.)
缩短html字符串测试(htm(l)?)-小心,这与您的捕获组号混淆
删除html周围的单词边界检查
使用?代替{0,1}
使用*代替{0,}
移除所有格量词(我不明白您为什么需要它)
忽略#之后的所有内容,替换中似乎不需要它


这给了我们^(\/event\/showEventList)(\.)(htm(l)?)(\??)([a-zA-Z0-9-_=&]+)*#(.+)$,它将您的示例替换为/events?pageNumber=1

要玩耍,请参见https://regexr.com/4otp7

10-07 16:56