簡體   English   中英

Javascript正則表達式-捕獲以另一個字符串開頭的字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM