簡體   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