【问题标题】:Regex PCRE: skip the first n occurences?正则表达式 PCRE:跳过前 n 次出现?
【发布时间】:2020-06-10 11:56:45
【问题描述】:

使用 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,见demo
  • @WiktorStribiżew 正如 OP 提到的第一个(12px)或第二个(4px),我认为你的答案是正确的。你可以发布它:-)
  • Wiktor Stribiżew 的那个工作正常,即使我更改了 {x} 值,以更改要跳过的出现次数。改变 {x} 值时,第四只鸟给出的返回奇怪的结果。但是他们都失去了我的捕获组(\d+)(px),我需要他们(对不起,我的问题应该更准确)

标签: regex pcre regex-lookarounds regex-group


【解决方案1】:

你可以使用

(?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

【讨论】:

  • @Zax 如果您不希望根据“跳过 n 次出现”而是根据“查找第 n 次出现”进行操作,那么您可以使用:^(?s)(?:.*?\b\K(?!1p)(\d+)(px)){3} 现在数字括号中的数字{3} 表示“匹配第 3 次出现”。
猜你喜欢
  • 1970-01-01
  • 2015-04-10
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多