2017-10-21 89 views
1

我有一個包含URL格式列表的REST文檔。
使用正則表達式從幾乎相同的字符串中獲取不匹配的子串

/com/shop/product/{product_id} 
/com/shop/{shop_id} 
/com/city/{city_name}/shop/{shop_id}/details 

等。

和動態的URL類似於下面

/com/shop/product/0ab12h 
/com/shop/j8khdj 
/com/city/bangalore/shop/78hj67/details 

我的投入將是一個動態的URL。
並且在傳遞任何動態URL時,我想查找匹配的記錄URL以及動態值的映射和大括號中標記的字段。

喜歡
/com/city/bangalore/shop/78hj67/details匹配的URL是
/com/city/{city_name}/shop/{shop_id}/details

和地圖應該是

city_name -> bangalore 
shop_id -> 78hj67 


我能夠與正常的字符串操作來實現它。但我想用REGEX來做。
可以實現嗎?

+1

Stackoverflow不是一個免費的代碼寫入服務。顯示你現在有什麼,需要改變什麼 – charlietfl

+0

早些時候我使用'/'分割了動態url。我還得到了包含動態值的所有子字符串。我正在遍歷文檔網址。我正在拆分並再次收集子字符串。然後比較我得到匹配的URL連同映射的字段。 – Shree

+0

在問題中顯示該代碼。本網站的目標是幫助你解決**你的代碼**不是從頭開始寫的。此外,如果您的代碼工作,可能會更好地詢問https://codereview.stackexchange.com/ – charlietfl

回答

1

用正則表達式解決這個問題並不是特別困難。

對於上述示例,您可以使用:(?:city\/)(\w+)(?:\/shop\/)(\w+) 並在匹配組1和2中找到答案(請按照模式中的鏈接獲取模式的深入說明)。

const regex = /(?:city\/)(\w+)(?:\/shop\/)(\w+)/g; 
const str = `/com/city/bangalore/shop/78hj67/details `; 
let m; 

while ((m = regex.exec(str)) !== null) { 
    // This is necessary to avoid infinite loops with zero-width matches 
    if (m.index === regex.lastIndex) { 
     regex.lastIndex++; 
    } 

    // The result can be accessed through the `m`-variable. 
    m.forEach((match, groupIndex) => { 
     console.log(`Found match, group ${groupIndex}: ${match}`); 
    }); 
} 

既然你似乎需要動態URL的不同部分,你可能不能夠拿出一個單一的正則表達式,做一切你。相反,你不得不編寫多個模式,這可能不會比使用普通字符串操作更好。

0

我採取了上述答案中提出的方法。
通常我們使用一個正則表達式匹配一個字符串列表。
但是在這裏,它反過來說,每個記錄的URL是一個正則表達式,它需要與動態URL匹配。
因此,在循環迭代中,
一個有記錄的URL將被逐一挑選出來並轉換爲正則表達式。

 // As fields inside curly braces can contain special characters 
    // using /\{[^}]+\}/g as regex 
    // As dynamic URL won't contain special chars replacing it with (\w+) 
    // Using() to group the dynamic fields 

    var regexUrl = docUrl.replace(/\{[^}]+\}/g, "(\\w+)"); 
    regexUrl = "^" + regexUrl + "$"; 
    var res = dynUrl.match(regexUrl); 

如果正則表達式匹配的模式,res將包含動態值的URL

 // Fetching dynamic fields from URL 
    var dynFields = docUrl.match(/\{[^}]+\}/g); 

使用dynFieldsres我們可以有地圖動態域和它的價值。

請檢查小提琴https://jsfiddle.net/jr9zx1xe/

這種方法比較複雜,我覺得字符串或基於特里樹的方法可以在降低複雜性是有用的。

+0

不錯。很高興你能想出一個有效的解決方案。 – wp78de

相關問題