为什么这个正则表达式捕获组不会为每个匹配重复?

时间:2015-09-27 17:52:18

标签: regex

我正在regex101.com

上对此进行测试

正则表达式:^\+([0-9A-Za-z-]+)(?:\.([0-9A-Za-z-]+))*$

测试字符串:+beta-bar.baz-bz.fd.zz

字符串匹配,但“匹配信息”框显示只有两个捕获组:

MATCH 1 1. [1-9] `beta-bar` 2. [20-22] `zz`

我期待所有这些捕获:

  1. 的β-杆
  2. 巴兹-BZ
  3. FD
  4. ZZ
  5. 为什么句点之间的每个标识符都不会被识别为自己的捕获组?

1 个答案:

答案 0 :(得分:3)

之所以发生这种情况,是因为当在捕获组上使用量词并且它被捕获 n 次时,只有最后捕获的文本存储在缓冲区中并在最后返回。

您可以preg_split使用简单的正则表达式[+.]$str = "+beta-bar.baz-bz.fd.zz"; $a = preg_split('/[+.]/', $str, -1, PREG_SPLIT_NO_EMPTY); 字符串,而不是匹配这些部分:

Array
(
    [0] => beta-bar
    [1] => baz-bz
    [2] => fd
    [3] => zz
)

请参阅IDEONE demo

结果:

(print "Enter the elements of the array")
(setq k 10)
(setq A (make-array '(10)))
(setq i 0)
(loop
    (if (>= i 10) (return))
    (setq x (read))
    (setf (aref A i) x)
    (incf i)
)

 (defun quicksort(start end)
 (if (< start end)
    ((setq pindex (lambda (start end)))
    (quicksort(start (- pindex 1)))
    (quicksort((+ pindex 1) end))))
  )
(defun partition(start end)
(setq pivot (aref A end))
(setq pindex start)
(setq j 0)
(loop
    (if (>= j end) return)
    (if (< (aref A j) pivot)
        ((setq temp (aref A pindex))
        (setq pindex (aref A j))
        (setq (aref A j) temp)
        (incf pindex)))
    (incf j)
)
(setq temp (aref A pindex))
(setq (aref A pindex) pivot)
(setq (aref A end) temp)
)
(quicksort 0 10)