[英]Javascript Regular Expressions - Capturing strings that are preceded by another string
我正在嘗試使用Javascript正則表達式從URL中提取一些變量值。 該網址采用以下格式:
@companyname/dl-molecularType-componentName
。
URL的示例是:
@companyname/dl-atoms-link
我想使用一個RegEx從URL中提取MolecularType和componentName給我一個數組:
['atoms', 'link']
使用出色的RegExr網站,這是我嘗試的方法:
正則表達式:
/(@company\\/dl+-)+(?!\\1)/g
我的想法是,第一個捕獲組將捕獲@companyname/dl-
,而第二個捕獲組將捕獲第一組中沒有的所有內容。 但是RegExr似乎建議這將返回與第一個捕獲組相同的結果。 有人可以幫忙嗎?
謝謝
您可以使用如下所示的代碼(請注意,我們知道結構並可以更好地微調正則表達式):
function extract_fields(url) { var match = url.match(/@[^\\/]+\\/dl-([^-]+)-(\\w+)/); if ( match ) { return {molecularType: match[1], componentName: match[2]}; } return false; } console.log(extract_fields('@companyname/dl-molecularType-componentName')); console.log(extract_fields('@companyname/dl-atoms-link'));
您現在正在使用的是負前瞻(?!\\1)
。 它的基本含義是“沒有跟第一個捕獲組中的相同”,但是它沒有捕獲它。
如果兩個變量始終都是單詞+數字,則可以使用\\w
(等於[a-zA-Z0-9_]
):
嘗試:
let regex = /(@companyname\\/dl-)(\\w+)-(\\w+)/; let testCases = [ "@companyname/dl-molecularType-componentName", "@companyname/dl-atoms-link" ]; testCases.forEach( str => { let match = str.match(regex); console.log('Whole match: ', match[0]); console.log('Molecular Type: ', match[2]); console.log('Component Name: ', match[3]); } )
在您的正則表達式中,您不必在捕獲組(@company\\/dl+-)+
捕獲字符串的開頭,也不必使用+
重復它,因為它只出現一次。 (?!\\1)
部分是一個否定的超前行為,並且是一個不占用任何字符的斷言。
獲取值的另一種方法可能是使用字符類 [az]
允許匹配的內容更精確,可以擴展該字符類以使其比az更匹配,並使用/i
標志使區分大小寫不敏感。
在2個捕獲組中捕獲您的匹配項,然后從結果中刪除包含完整匹配項的第一項:
[ "@companyname/dl-molecularType-componentName", "@companyname/dl-atoms-link" ].forEach(s => { console.log(s.match(/@companyname\\/dl-([az]+)-([az]+)/i).slice(1)); });
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.