首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式匹配两个非特定长度范围的URL段

正则表达式匹配两个非特定长度范围的URL段
EN

Stack Overflow用户
提问于 2013-02-21 03:31:33
回答 1查看 889关注 0票数 0

在URL的形式中,我使用开头的两个假子目录来表示区域和语言:

代码语言:javascript
复制
/gb/en/tours/lesson-observation

当开头的两个假子目录分别为2-3和2-5字符时,此正则表达式匹配。(附带说明:我不知道为什么要在这里使用{1,2}而不是{2,3}。)

代码语言:javascript
复制
/^\/.{1,2}[^\/]\/.{1,4}[^\/]\/(.*)/

当请求的URL与^/2-3chars/2-5chars/模式不匹配时,我如何获取原来请求的URL的全部内容,以便重定向到/gb/en$1。(这是需要的,因为网站的英国区域和英语版本是默认的,如果在请求的URL中找不到区域和语言代码,则应该使用。)

示例:

代码语言:javascript
复制
/page-name
is not matched by the /2-3/2-5 pattern and so should be redirected to:
/gb/en/page-name

/ca/fr/page-name
is matched by the /2-3/2-5 pattern and so should not be redirected
EN

回答 1

Stack Overflow用户

发布于 2013-02-21 03:59:24

为了与此相匹配:

代码语言:javascript
复制
/gb/en/tours/lesson-observation

您可以使用:

代码语言:javascript
复制
/[^/]{2,3}/[^/]{2,5}/.*

现在,您需要检测前两个段不在这些范围内的时间,因此第一个段高于或低于2-3个字符:

代码语言:javascript
复制
/[^/]?/                   <-- 0 or 1 characters
/[^/]{4,}/                <-- 4 or more characters
/(?:[^/]?|[^/]{4,})/     <-- Combine the above two with an OR (|)

同样,关于第二部分:

代码语言:javascript
复制
/(?:[^/]?|[^/]{5,})/     <-- 0 or 1 characters, or 5 or more characters

将两者结合起来,您就有了一个正则表达式,用于任何与我们的第一个正则表达式不匹配的内容:

代码语言:javascript
复制
/(?:[^/]?|[^/]{4,})/(?:[^/]?|[^/]{5,})/.*

注意,在所有这些正则表达式中,我省略了分隔符,但请记住,您不必使用/作为分隔符。您可以使用#~或任何您想要的字符。好处是:如果不使用/作为分隔符,则可以在最终正则表达式中不对/进行转义:

代码语言:javascript
复制
#/(?:[^/]?|[^/]{4,})/(?:[^/]?|[^/]{5,})/.*#   <-- # is the delimiter

编辑:,因为第二个URL段是可选的,所以第二个段需要这样的内容:

代码语言:javascript
复制
(?:/(?:[^/]?|[^/]{5,})/)?

将它带回到完整的正则表达式中,我们得到(带有锚和分隔符):

代码语言:javascript
复制
#^/(?:[^/]?|[^/]{4,})(?:/(?:[^/]?|[^/]{5,})/)?.*$#
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14994085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档