【问题标题】:Apache2 Regular Expression Optional Capture GroupApache2正则表达式可选捕获组
【发布时间】:2016-08-18 14:35:02
【问题描述】:

需要帮助解决困扰我一段时间的问题!

我正在尝试创建一个匹配 URL 的 Apache AliasMatch 正则表达式。我遇到的问题是我在文件匹配部分中使用捕获组作为变量$0 $1 $2。本质上,我需要捕获 url 的 path/to/controller 部分来实际抓取我的文件,并且我希望在双斜杠之后(包括双斜杠)不使用任何捕获组。

http://domain.com/etc/xx/abc/path/to/controller//myDesiredMVCAction

问题本质上是以下表达式:

^/etc/(xx|yy)/(abc|xyz)/(.*)(?=//)(.*)

只匹配

http://domain.com/etc/xx/abc/path/to/controller//myDesiredMVCAction

而不是:

http://domain.com/etc/xx/abc/path/to/controller

考虑到双斜杠及其后面的所有内容都是可选的。

因此,当我通过附加? 使正则表达式成为可选时,它会通过包含//myDesiredMVCAction 部分来破坏捕获组..

^/etc/(xx|yy)/(abc|xyz)/(.*)(?=//)(.*)?

有可能实现我所追求的吗?

【问题讨论】:

    标签: regex apache2


    【解决方案1】:

    相信你可以使用

    ^/etc/(xx|yy)/(abc|xyz)/(.*?)(?://.*)?$
                            ^^^^^^^^^^^^^^^
    

    regex demo

    问题是,模式的 (.*?)(?://.*)?$ 部分以这样一种方式工作,即 (.*?) 不会先尝试,因为它是用 *? 懒惰地量化的,然后先尝试 (?://.*)?$,而当后者不匹配,(.*?) 扩展,在每个扩展步骤将一个字符写入组值。

    模式匹配:

    • ^/etc/ - /etc/ 在基本 URL 之后
    • (xx|yy)/ - xxyy 然后是 /
    • (abc|xyz)/ - 一个abcxyz 和一个/
    • (.*?) - 任何零个或多个字符,但尽可能少在第一个之前
    • (?://.*)? - (可选组,由于末尾有?)两个/s 后跟任意字符,尽可能多到
    • $ - 字符串输入的结尾。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-15
    • 1970-01-01
    相关资源
    最近更新 更多