express js:RegEx的条件路由参数

时间:2014-02-22 00:49:33

标签: javascript regex node.js express

我需要匹配具有此格式的路线:/city-state-country

city的格式可以是:san-francisco(由' - '分隔的多字组)或newtown(单字)。

还有一些国家state失踪了,所以路线中的'-state'参数应该是可选的。

如何严格匹配匹配我的路由模式,这意味着它将采用由' - '分隔的2或3个参数?

我有这样的事情:

app.get(/([A-Za-z\-\']+)-([A-Za-z\']+)-([A-Za-z\']+)/, routes.index_location);

但是,它没有用。

最终,像这样的案件不应该起作用:

/c/san-jose-ca-us
/san-jose-ca-us-someweirdstuff

3 个答案:

答案 0 :(得分:1)

san-jose-ca-us-someweirdstuff可以解析为san-jose-ca(城市) - us(州) - someweirdstuff(国家/地区),因此这是完全有效的案例

除非你错过了什么,否则这项任务通常是不可能的。我们知道us不是状态,但正则表达式不是。

您可以尝试将城市中的破折号限制为一个,或者枚举所有可能的国家/地区,或者执行类似的操作......无论如何,这与正则表达式无关,实际上。

答案 1 :(得分:0)

实际上,有一种方法。但是,这需要一个多步骤的过程。在第一遍中,用不同的分隔符替换所有两个字母状态(因为它们是可选的)。在第二轮中,使用不同的分隔符替换所有国家/地区,以便您可以识别城市。在第三个过程中,将所有城市破折号替换为其他角色,并使用破折号分隔符添加状态和国家/地区。在最后一遍中,使用您期望的分隔符将您的城市替换为不同的分隔符。

例如:

  1. 用〜$ 1 san-jose-ca-us = san-jose~ca-us
  2. 替换/-(al|ca|az ...)/
  3. 用〜$ 1 san-jose替换/-(.+)$/~ca-us = san-jose~ca~us
  4. 替换/ - /与* $ 1 san-jose~ca~us = san * jose~ca~us
  5. 替换/〜/ with - san * jose~ca~us = san * jose-ca-us

答案 2 :(得分:0)

如果您只想将信息保存在1级层次结构中,可以尝试使用下划线分隔符。所以,您的网址如下:city_state_country