我在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-_=&]{0,}+)(#{0,1})([a-zA-Z0-9-_=&]{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-_=&]{0,}+)(#{0,1})([a-zA-Z0-9-_=&]{0,}+)$
有7个组,它们是:(/event/showEventList)
:匹配/ event / showEventList(\.{1})
:与单个点(。)匹配(\bhtm\b|\bhtml\b)
:仅匹配htm或html(\?{0,1})
:与问号(?)匹配,该问号可能会出现零或一个([a-zA-Z0-9-_=&]{0,}+)
:匹配查询字符串,该字符串可以出现零个或多个(#{0,1})
:匹配可能会出现零或一的井号(#)([a-zA-Z0-9-_=&]{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