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