【问题标题】:RegEx for a url path that can just be a forward slash正则表达式用于可以只是正斜杠的 url 路径
【发布时间】:2020-11-27 12:36:28
【问题描述】:

我正在尝试创建一个正则表达式来验证 URL 路径。 我想出了这个:

^\/([a-zA-Z0-9\-]+)?$

这允许我使用//moo 或更复杂的/products-123,但它不允许我使用多个正斜杠,如/blog/posts-123。 有人可以帮我解决这个问题吗?

理想情况下它应该能够允许:

  1. 只需要一个正斜线作为主路径
  2. 正斜杠后跟字母数字(带破折号)
  3. 第 2 步无限重复
  4. 不应允许任何路径以正斜杠结尾

如果有人能帮我解决这个问题,那就太好了

【问题讨论】:

    标签: regex


    【解决方案1】:

    这个正则表达式允许

    • 单斜杠,或
    • 斜线,后跟字母数字字符和破折号,重复 1 次或多次:

    let urls = [
      '/',
      '/aaa-bbb',
      '/aaa-bbb/ccc',
      '/aaa-bbb/ccc/ddd',
      '/aaa-bbb/ccc/ddd/eee',
      '',  // empty
      '//double-slash',
      '/end-with-slash/',
    ];
    let regex = /^(\/|(\/[a-zA-Z0-9\-]+)+)$/;
    urls.forEach((url) => {
      let result = regex.test(url);
      console.log('"' + url + '"  ==> ' + result);
    });

    结果:

    "/"  ==> true
    "/aaa-bbb"  ==> true
    "/aaa-bbb/ccc"  ==> true
    "/aaa-bbb/ccc/ddd"  ==> true
    "/aaa-bbb/ccc/ddd/eee"  ==> true
    ""  ==> false
    "//double-slash"  ==> false
    "/end-with-slash/"  ==> false
    

    从结果中可以看出,它防止了一个空的url路径,一个带有双斜杠的url路径,一个以斜杠结尾的url路径。

    正则表达式的解释:

    • ^(\/|(...)+)$ - 需要一个斜杠或括号中的 1+ 序列
    • \/[a-zA-Z0-9\-]+$ - 括号中的序列是一个斜杠,后跟一个或多个字母数字字符和破折号

    【讨论】:

      【解决方案2】:

      要同时匹配单个/ 并且不以/ 结尾,您可以使用

      ^/(?:(?:[a-zA-Z0-9-]+/)*[a-zA-Z0-9-]+)?$
      

      说明

      • ^ 字符串开始
      • / 匹配单个/
      • (?:非捕获组
        • (?:[a-zA-Z0-9-]+/)* 可以选择重复 1+ 列出的任何一个,然后是 /
        • [a-zA-Z0-9-]+ 匹配 1+ 任何列出的
      • )?关闭非捕获组并使其可选
      • $字符串结束

      Regex demo

      【讨论】:

        【解决方案3】:

        其实我想我想通了:

        ^\/([a-zA-Z0-9\-]+)(\/([a-zA-Z0-9\-]+))?$
        

        【讨论】:

        • 这是否支持您的需求?看起来它不匹配单个斜杠,它只匹配一个或两个/some-thing 序列,而不是多个。请参阅我的回答,该回答支持您所述的所有要求。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-21
        • 1970-01-01
        • 1970-01-01
        • 2011-03-09
        • 1970-01-01
        相关资源
        最近更新 更多