java正则表达式添加尾部斜杠

java正则表达式添加尾部斜杠,java,regex,magnolia,Java,Regex,Magnolia,我正在尝试重定向URL以添加尾部斜杠 /news -> /news/ /news?param1=value1 -> /news/?param1=value /news#anchor?param1=value1 -> /news/#anchor?param1=value1 我需要通过一个只标识路径和add/的正则表达式来完成。如果没有参数,就没有问题 ^(/[a-z0–9/\-]*[^/])$->$1/ 但是当存在参数时,我无法创建将路径与参数分离的正则表达式 有什么想法吗?谢

我正在尝试重定向URL以添加尾部斜杠

/news -> /news/
/news?param1=value1 -> /news/?param1=value
/news#anchor?param1=value1 -> /news/#anchor?param1=value1
我需要通过一个只标识路径和add/的正则表达式来完成。如果没有参数,就没有问题

^(/[a-z0–9/\-]*[^/])$->$1/

但是当存在参数时,我无法创建将路径与参数分离的正则表达式


有什么想法吗?谢谢

您不应该将字符串结尾与
$
匹配,也不需要在结尾处添加
[^/]

^(/[a-z0–9/_\-]*)
const regex=new RegExp(“^(/[a-z0-9/\-]*)”;
console.log(“/news.replace”(regex,“$1/”);
log(“/news?param1=value1.replace(regex,“$1/”));

console.log(“/news#anchor?param1=value1.replace(regex,“$1/”)您不应该将字符串的结尾与
$
匹配,也不需要在结尾处使用
[^/]

^(/[a-z0–9/_\-]*)
const regex=new RegExp(“^(/[a-z0-9/\-]*)”;
console.log(“/news.replace”(regex,“$1/”);
log(“/news?param1=value1.replace(regex,“$1/”));

console.log(“/news#anchor?param1=value1.replace(regex,“$1/”)
您尝试的模式只匹配
/news
,因为锚点
$
断言字符串的结尾

如果省略锚定符,它还将与
#
匹配,因为您使用的
[^/]
匹配除正斜杠以外的任何字符

^(?:/[a-z0-9_-]+)+

您可以重复1次或多次匹配正斜杠,后跟字符类中列出的任何字符1次或多次,以防止匹配
//

在替换中,使用完全匹配并添加正斜杠

^(?:/[a-z0-9_-]+)+
|

输出

/news/
/news/?param1=value1
/news/#anchor?param1=value1
注意在正则表达式中,这部分
0–9
中的
连字符是


您尝试的模式只匹配
/news
,而不是,因为锚点
$
断言字符串的结尾

如果省略锚定符,它还将与
#
匹配,因为您使用的
[^/]
匹配除正斜杠以外的任何字符

^(?:/[a-z0-9_-]+)+

您可以重复1次或多次匹配正斜杠,后跟字符类中列出的任何字符1次或多次,以防止匹配
//

在替换中,使用完全匹配并添加正斜杠

^(?:/[a-z0-9_-]+)+
|

输出

/news/
/news/?param1=value1
/news/#anchor?param1=value1
注意在正则表达式中,这部分
0–9
中的
连字符是


而不是

可能只需要将字符串的结尾扩展到参数之外。
包含参数和不包含参数可能是:

^(/[a-z0-9/-]*(?->
$1/$2


请参见

可能只需要将字符串的结尾扩展到参数之外。
包含参数和不包含参数可能是:

^(/[a-z0-9/-]*(?->
$1/$2


请参见

您可以按如下方式进行操作:

public class Main {
    public static void main(final String[] args) {
        String[] arr = { "/news", "/news?param1=value1", "/news#anchor?param1=value1" };
        for (String s : arr) {
            System.out.println(s.replaceFirst("([^\\/\\p{Punct}]+)", "$1/"));
        }
    }
}
输出:

/news/
/news/?param1=value1
/news/#anchor?param1=value1
正则表达式的解释:

/news/
/news/?param1=value1
/news/#anchor?param1=value1
  • :开始捕获组#1
    • [
      :开始
      • ^
        :没有
        • \/
          :一个
          /
          字符
        • \p{Punct}
          :A
    • ]
      :字符类结束
    • +
  • :捕获组结束#1

您可以按如下方式执行:

public class Main {
    public static void main(final String[] args) {
        String[] arr = { "/news", "/news?param1=value1", "/news#anchor?param1=value1" };
        for (String s : arr) {
            System.out.println(s.replaceFirst("([^\\/\\p{Punct}]+)", "$1/"));
        }
    }
}
输出:

/news/
/news/?param1=value1
/news/#anchor?param1=value1
正则表达式的解释:

/news/
/news/?param1=value1
/news/#anchor?param1=value1
  • :开始捕获组#1
    • [
      :开始
      • ^
        :没有
        • \/
          :一个
          /
          字符
        • \p{Punct}
          :A
    • ]
      :字符类结束
    • +
  • :捕获组结束#1

您可以使用非常简单的正则表达式,如下所示:

^([/\w]+)
使用此替换字符串:
$1/


您可以使用非常简单的正则表达式,如下所示:

^([/\w]+)
使用此替换字符串:
$1/


正则表达式中的
$
匹配输入的结尾(或多行模式下的一行),因此它不会将任何url与路径参数匹配。正则表达式中的
$
匹配输入的结尾(或多行模式下的一行),所以它不会将任何url与路径参数匹配。它工作得非常好,我只添加了它也接受大写字母。非常感谢,我已经为这个问题发疯了。它工作得非常好,我只添加了它也接受大写字母。非常感谢,我已经为这个问题发疯了.