如何在app.yaml中使用正则表达式处理虚拟子目录?

时间:2017-07-01 14:17:25

标签: regex google-app-engine app.yaml

我想将所有访问者的“单个子目录”指向一个页面,将所有访问者指向“双子目录”到另一个页面。 E.g:

/foo/
/new/
/north/
/1-j4/

所有人都指向1.app,而

/foo/bar/
/new/york/
/north/west/
/1-j4/a_990/

都会指向2.app。

我想我可以用非贪婪的正则表达式匹配来做到这一点,如下:

- url: /(.*?)/$
  script: 1.app

- url: /(.*?)/(.*?)/$
  script: 2.app

令我困惑的是,/ foo /和/ foo / bar /解析为脚本1.app。 “懒惰”的正则表达式是否强制包含中间/,因为这是获得匹配的唯一方法?我怎么能这样做?我尝试过使用(\ w *?)但得到相同的结果。

2 个答案:

答案 0 :(得分:1)

.*?仍将匹配任意数量的/,因为.匹配任何字符,但是换行符(默认情况下)。您需要将regexp建立在一个否定的字符类[^/]*上,该字符匹配除/以外的0个或多个字符。

要将目录与一个部分匹配,请使用^([^/]*)/?$并将其与2匹配,请使用^([^/]*)/([^/]*)/?$

请注意,如果您计划在在线Web测试人员中使用这些模式,则必须在大多数模式中使用/,因为默认情况下他们使用/符号作为正则表达式分隔符。

答案 1 :(得分:1)

是的,(.*?)包含斜杠,因此会解析为1.app。如果先放置2.app处理程序,它应该按照你想要的那样执行:

- url: /(.*?)/(.*?)/$
  script: 2.app

- url: /(.*?)/$
  script: 1.app