[英]Regex - Repeating Capturing Group
我試圖弄清楚如何在以下 url 字符串中的comma-separated
值上重復捕獲組:
id=1,2;name=user1,user2,user3;city=Oakland,San Francisco,Seattle;zip=94553,94523;
我正在使用這個RegExp
,它是我想要的返回結果,但值除外,因為它們是動態的,即。 url 參數中可能有 2、3、4 等用戶,我想知道是否可以為每個值創建一個捕獲組,而不是將user1,user2,user3
作為一個捕獲組。
正則表達式: (^|;|:)(\\w+)=([^;]+)*
這是使用RegExp在線進行的現場演示
示例輸出:
等等...基於我之前解釋的動態值。
問題:我的表達式有什么問題我使用*
來循環重復模式?
正則表達式不支持您嘗試執行的操作。 當引擎第二次進入捕獲組時,它會覆蓋第一次捕獲的內容。 考慮一個簡單的例子(感謝正則表達式.info ): /(abc|123)+/
用於'abc123'
。 它將匹配“abc”,然后看到加號並重試,匹配“123”。 輸出中的最終捕獲組將為“123”。
無論您嘗試哪種模式,當正則表達式接受字符串時,您設置的任何限制都會發生這種情況。 考慮/(abc|123){2}/
。 這接受帶有捕獲組的“abc123”為“123”,但不接受“abc123abc”。 將一個捕獲組放入另一個組中也不起作用。 創建捕獲組時,就像創建變量一樣。 它只能有一個值,后續值會覆蓋前一個值。 您永遠無法擁有比括號對更多的捕獲組(不過,您絕對可以擁有更少的捕獲組)。
一個可能的解決方法是在 ';' 上拆分字符串,然后是在 '=' 上的每個字符串,然后是在 ',' 上的字符串的右側。 那會讓你[['id', '1', '2'], ['name', 'user1', ...], ['city', ...], ['zip', ...]]
。
結果是:
function (str) {
var afterSplit = str.split(';|:');
afterSplit.pop() // final semicolon creates empty string
for (var i = 0; i < afterSplit.length; i++) {
afterSplit[i] = afterSplit[i].split('=');
afterSplit[i][1] = afterSplit[i][1].split(','); // optionally, you can flatten the array from here to get something nicer
}
return afterSplit;
}
重復捕獲組
字符串:!abc123def! 正則表達式:/!((abc|123|def)+)!/
比賽:
第 1 組:abc123def
第 2 組:定義
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.