JS Regex匹配Chars - 或者没有 -

时间:2015-10-04 04:40:35

标签: javascript regex node.js koa koa-router

我希望能够匹配以下任何一项:

unitedstatesofamerica
united-states-of-america

匹配有或没有短划线的字符,允许其中任何一个。

这样做的目的是让我可以让uris进入我的路由器来匹配。

例如我想允许a-z的灵活性并允许任何单词分开,因为我们可能允许调用者发送seo友好的值

/countries/united-states-of-america
/countries/unitedstatesofamerica
/countries/germany
/countries/stlucia
/countries/st-lucia

我正在使用koa-controller并尝试提出正则表达式路由以允许此操作。据我所知,我认为koa-controller使用中间件path-to-regexp

对于不了解的人,我所要问的并不清楚。我只是尝试为我的koa控制器路由创建一个带正则表达式的路由,这将允许调用者发送允许名称的URL,而名称可能有破折号。

这是我没有运气的尝试。我要么没有正确使用正则表达式,要么语法正确,以及如何将正则表达式添加到koa-route或同时出错?我不知道哪个:

'/countries/:countryUrlFriendlyName(/^[a-z-]+$/i)/states/:stateUrlFriendlyName(/^[a-z-]+$/i)/cities/:cityUrlFriendlyName(/^[a-z-]+$/i)': {to: 'city#findByCountryAndStateAndCityUrlFriendlyName'}

'/countries/:(/^[a-z-]+$/i)/states/:(/^[a-z-]+$/i)/cities/:(/^[a-z-]+$/i)': {to: 'city#findByCountryAndStateAndCityUrlFriendlyName'}

'/countries/(/^[a-z-]+$/i)/states/(/^[a-z-]+$/i)/cities/(/^[a-z-]+$/i)': {to: 'city#findByCountryAndStateAndCityUrlFriendlyName'},

'/countries/:countryUrlFriendlyName\/^[a-z-]+$/i\/states/:stateUrlFriendlyName\/^[a-z-]+$/i\/cities/:cityUrlFriendlyName\/^[a-z-]+$/i': {to: 'city#findByCountryAndStateAndCityUrlFriendlyName'},

'/countries/:countryUrlFriendlyName/^[a-z-?]+$/i/states/:stateUrlFriendlyName/^[a-z-?]+$/i/cities/:cityUrlFriendlyName/^[a-z-?]+$/i': {to: 'city#findByCountryAndStateAndCityUrlFriendlyName'},

'/countries/:countryUrlFriendlyName(/^[a-z-?]+$/i)\/states/:stateUrlFriendlyName(/^[a-z-?]+$/i)/cities/:cityUrlFriendlyName(/^[a-z-?]+$/i)': {to: 'city#findByCountryAndStateAndCityUrlFriendlyName'},

'/countries/:\/^[a-z-]+$/i\/states/:\/^[a-z-]+$/i\/cities/:\/^[a-z-]+$/i': {to: 'city#findByCountryAndStateAndCityUrlFriendlyName'}

所有这些都试图让这个工作在上面,我尝试了所有这些不同的路由定义,没有一个匹配例如传入的请求:

/countries/united-states-of-america/states/illinois/cities/chicago就是一个例子。我只是试图为我的koa路线定义一条有效的路线。

例如, countryUrlFriendlyName 就是名为params,它映射到koa-controller中间件中的控制器操作方法。我想让人们用破折号发送这些参数的值。

我有一个控制器,这些参数被映射到。所以to:part意味着我映射到以#命名的函数:[param name]映射到。

正如你可以看到的更多的故事,路线有点长,但我试图集中精力试图让正则表达式为国家工作作为一个例子。我的完整路线允许国家/ [姓名] /州/名称/城市/ [名称],它是[我想要允许他们用连字符发送的名称],是的连字符可以在那里,或者是随机还是没有。

我允许我们的网络团队就他们发送到我们API的一些seo名称请求匹配。

2 个答案:

答案 0 :(得分:3)

united-?states-?of-?america

?-成为可选项。

答案 1 :(得分:0)

我认为你的问题是你有一个字符串"unitedstatesofamerica",你想要匹配那个字符串,但是随机位置中间有任意数量的连字符。

在这种情况下,您必须自己构建一个正则表达式,您可以通过

来完成
function make_regexp_with_inserted_hyphens(str) {
  return new RegExp(str.split('') . map(chr => chr + "-?") . join(''));
}

make_regexp_with_inserted_hyphens("unitedstatesofamerica")
/u-?n-?i-?t-?e-?d-?s-?t-?a-?t-?e-?s-?o-?f-?a-?m-?e-?r-?i-?c-?a-?/

要匹配任何单词:

function make_multi_regexp_with_inserted_hyphens(strings) {
  return strings.map(make_regexp_with_inserted_hyphens) . join('|');
}

make_multi_regexp_with_inserted_hyphens("germany", "stlucia")
/g-?e-?r-?m-?a-?n-?y-?/|/s-?t-?l-?u-?c-?i-?a-?/