JS Regex 匹配字符有 - 或没有 -

JS Regex to match Chars with - or without -

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

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 and trying to come up with a regex route to allow this. As far as I know I think koa-controller uses middleware path-to-regexp

我问的不是不明白的人。我只是想为我的 koa-controller 路由创建一个带有正则表达式的路由,这将允许调用者发送允许名称的 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'}

所有这些都是为了让这个在上面工作,我尝试了所有这些不同的路由定义并且 none 会匹配例如传入请求:

/countries/united-states-of-america/states/illinois/cities/chicago 举个例子。我只是想为我的 koa 路线定义一条可行的路线。

例如 countryUrlFriendlyName 只是命名参数,映射到 koa-controller 中间件中我的控制器操作方法。我想让人们为那些带破折号或不带破折号的参数发送值。

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

正如您所见,这个故事还有更多内容,路线有点长,但我试图集中精力让正则表达式为国家/地区工作作为示例。我的完整路线允许 countries/[name]/states/name/cities/[name] 并且它是 [name] 我想让他们发送连字符或不连字符是的,连字符可以在那里,或者随机或不在那里。

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

united-?states-?of-?america

? 将使 - 可选。

我假设您的问题是您有一个字符串 "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-?/