繁体   English   中英

JS 正则表达式匹配带 - 或不带 - 的字符

[英]JS Regex to match Chars with - or without -

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

unitedstatesofamerica
united-states-of-america

所以匹配有或没有破折号的字符,允许。

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

例如,我想允许 az 的灵活性并允许分隔任何单词,因为我们可能允许调用者发送 seo-friendly 值

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

等等。

我正在使用koa-controller并试图想出一个正则表达式来实现这一点。 据我所知,我认为 koa-controller 使用中间件路径到正则表达式

我问的是不明白的人不清楚。 我只是想为我的 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'}

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

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

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

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

正如你所看到的,故事还有更多,路线有点长,但我试图专注于让正则表达式为国家工作作为例子。 我的完整路线允许国家/[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-?/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM