簡體   English   中英

正則表達式 - 重復捕獲組

[英]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在線進行的現場演示

示例輸出:

  • Group1 - (分號,冒號)
  • Group2 - (key ie. id,name,city,zip)
  • 組 3 -(值 1)
  • Group4 - (value2) *如果存在
  • Group5 - (value3) *如果存在
  • Group6 - (value4) *如果存在

等等...基於我之前解釋的動態值。

問題:我的表達式有什么問題我使用*來循環重復模式?

正則表達式不支持您嘗試執行的操作。 當引擎第二次進入捕獲組時,它會覆蓋第一次捕獲的內容。 考慮一個簡單的例子(感謝正則表達式.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 組:定義

來源: https : //www.regular-expressions.info/captureall.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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