【问题标题】:Regex: Matching route parameters between slashes only but optional end slash正则表达式:仅在斜杠之间匹配路由参数,但可选结束斜杠
【发布时间】:2020-06-17 23:30:36
【问题描述】:

所以我在这里有这个正则表达式:

\/?({[a-zA-Z_0-9]*})\/?

我希望它匹配这些:

# Valid
/test3/{id}/{test}/{id}

# Valid
/admin/{slug}

# Not Valid
/test3{id}{test}

# Not Valid
/test/{id}/yyy/{dd}/dwdw/{wd}{d}

# Valid
/user/post/{id}

# Valid
/{tt}/{t}

# Valid
/test/{id}/yyy/{dd}////dwdw/{wd}/{d}

但我希望它不匹配它们之间没有斜线的参数,例如 {id}{test} 不应该匹配。

我该怎么做?

我在这里设置了一个正则表达式:https://regex101.com/r/awUDhM/5

【问题讨论】:

    标签: regex preg-match-all


    【解决方案1】:

    您可以查找 /foo/{bar} 或空的 / 的重复模式。代码sn-p:

    var input = [
      '/test3/{id}/{test}/{id}',
      '/admin/{slug}',
      '/test3{id}{test}',
      '/test/{id}/yyy/{dd}/dwdw/{wd}{d}',
      '/user/post/{id}',
      '/{tt}/{t}',
      '/test/{id}/yyy/{dd}////dwdw/{wd}/{d}'
    ];
    input.forEach(function(str) {
      var result = /^(\/([a-zA-Z0-9]*|\{[a-z]+\}))+$/.test(str);
      console.log(str + ' ==> ' + result);
    });

    输出:

    /test3/{id}/{test}/{id} ==> true
    /admin/{slug} ==> true
    /test3{id}{test} ==> false
    /test/{id}/yyy/{dd}/dwdw/{wd}{d} ==> false
    /user/post/{id} ==> true
    /{tt}/{t} ==> true
    /test/{id}/yyy/{dd}////dwdw/{wd}/{d} ==> true
    

    /^(\/([a-zA-Z0-9]*|\{[a-z]+\}))+$/正则表达式的解释:

    • ^ -- 锚点在字符串的开头
    • (...)+ -- 出现一次或多次内部情况
    • \/(...|...) -- 需要一个斜杠,后跟一个逻辑 OR 组
    • [a-zA-Z0-9]* -- 第一个 OR 项目:只有字母数字字符,包括无
    • \{[a-z]+\} -- 第二个 OR 项:{...} 中包含的一个或多个小写字符
    • $ -- 锚点在字符串的末尾

    【讨论】:

    • 这很有用,谢谢你的解释但是如果我只想匹配{ }之间的参数呢?
    • 没关系,我没有在最后添加 m 选项。
    【解决方案2】:

    只需检查字符串中是否没有}{

    ^(?:(?!}{).)+$
    

    Demo & explanation

    php代码:

    $strs = [
      '/test3/{id}/{test}/{id}',
      '/admin/{slug}',
      '/test3{id}{test}',
      '/test/{id}/yyy/{dd}/dwdw/{wd}{d}',
      '/user/post/{id}',
      '/{tt}/{t}',
      '/test/{id}/yyy/{dd}////dwdw/{wd}/{d}',
    ];
    foreach($strs as $str) {
        if (preg_match('/^(?:(?!}{).)+$/', $str)) {
            echo "valid: $str\n";
        } else {
            echo "Not valid: $str\n";
        }
    }
    

    输出:

    valid: /test3/{id}/{test}/{id}
    valid: /admin/{slug}
    Not valid: /test3{id}{test}
    Not valid: /test/{id}/yyy/{dd}/dwdw/{wd}{d}
    valid: /user/post/{id}
    valid: /{tt}/{t}
    valid: /test/{id}/yyy/{dd}////dwdw/{wd}/{d}
    

    【讨论】:

      猜你喜欢
      • 2018-06-05
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      • 2013-05-15
      • 2012-01-12
      • 1970-01-01
      相关资源
      最近更新 更多