正则表达式 PCRE:跳过前 n 次出现?

Regex PCRE: skip the first n occurences?

使用 PCRE 正则表达式时,有没有办法跳过前 n 次出现?我看到一些 \K 的例子,但我不明白如何使用它。

目标是找到 "px" 个值,所以这是我使用的正则表达式:

(?!1px)(\d+)(px)

(?!1px) 用于忽略“1px”。

考虑到以下示例字符串,我如何跳过第一个 (12px) 或第二个 (4px) 匹配,以匹配只有第三个 (2px)?

* {margin: 0; padding: 0; font-size: 12px; color: #555;}

.test {
    display: inline-block;
    border: 1px solid #000;
    box-shadow:  #aaa 4px 2px 6px;
    width: 36px;
    height: 24px;
}

您可以使用

(?s)^(?:.*?\b(?!1p)\d+px){2}.*?\K\b(?!1p)(\d+)(px)

regex demo

详情

  • (?s) - DOTALL s 标志使 . 也匹配换行符
  • ^ - 字符串的开头
  • (?:.*?\b(?!1p)\d+px){2} - 任意 0 个或多个字符恰好出现两次,尽可能少,然后是 1+ 位数字 + px1px
  • .*? - 任意 0+ 个字符,尽可能少
  • \K - match reset operator 丢弃目前匹配的文本
  • \b - 单词边界
  • (?!1p) - 不允许 1p 立即向右
  • (\d+)(px) - 在第 1 组中捕获了 1+ 个数字,在第 2 组中捕获了 px 个数字。