pcre 正则表达式匹配第 n 次出现

pcre regex match nth occurence

这是不是重复的。问之前已经查过了

我用 | 分隔这个字符串,我想匹配 nth 元素。

aaaaaaaaa aaa|bb bbbbb|cccc ccccccc|ddd ddddddd|aaa aaa aaaaa|zzz zzz zzzzzzz

我越接近使用这个模式,但它有问题:

([^\|]*\|){2}[^\|]*

https://regex101.com/r/EYZbK5/1

这是普通的 pcre。在这种情况下,不能使用javascript这样的.split()

假设我想获取第三个元素cccc ccccccc我应该使用什么正则表达式?

您可以使用

^(?:[^|]*\|){2}\K[^|]*

参见regex demo

详情

  • ^ - 字符串开头
  • (?:[^|]*\|){2} - non-capturing group 匹配两个连续出现的
  • \K - match reset operator 丢弃到目前为止匹配的文本
  • [^|]* - |.
  • 以外的 0+ 个字符

为避免空字符串匹配,您可以将最后一个 [^|]* 替换为 [^|]+

您可以使用锚点断言行的开头,然后重复不匹配 | 后跟 | 2 次。然后捕获包含 cccc ccccccc

的捕获组中的第三部分

^(?:[^|]*\|){2}([^|]*)

Regex demo

说明

  • ^ 断言行首
  • (?:开始非捕获组
    • [^|]*\| 使用否定 character class 零次或多次后跟 |.
    • 来匹配非 |
  • ){2} 关闭非捕获组并重复 2 次
  • ([^|]*) 在匹配组中捕获不是 | 零次或多次

你可以尝试这个并参加 group2

(\|?(.*?)(?:\|)){3}

demo and explanation