正则表达式提取由管道分隔的字符串的第 n 个标记

Regex to extract nth token of a string separated by pipes

我是正则表达式的新手

我需要从以下示例文本中计算并提取标记:

AA||CCCCCCCC|||FFFFFFFFFFF

请求第 4 个令牌我必须得到一个空的 '' 字符串,请求第 6 个我必须得到 'FFFFFFFFFFF'

是否可以有这样的正则表达式?

提前致谢!

PS:对于令牌计数,我使用 '\|' 将 +1 添加到结果是字符串不为空,当然还有另一种更有效的方法来做到这一点仅使用正则表达式...

| 上拆分字符串会更有效,但这也有效。

代码

我们将大括号中的数字称为计数器 {X}。该计数器从 0 开始。如果它设置为 0,我们将获得 1st 元素,如果它设置为 5,我们将获得 6th 元素,等等

See regex in use here

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

或者,如果您的正则表达式引擎不支持 \K,您可以使用以下内容(第一个捕获组中的结果):

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

说明

  • ^ 在行首声明位置
  • (?:[^|]*\|){5} 恰好匹配以下5次
    • [^|]* 匹配除 | 之外的任何字符任意次数
    • \| 按字面匹配 |
  • \K 重置比赛的起点。任何之前消耗的字符不再包含在最终匹配中
  • [^|]* 匹配除 | 之外的任何字符任意次数

对于 DB2,请尝试使用此方法获取列表中的第 6 个元素。这适用于 Oracle 并允许 NULL 列表元素。 REGEXP_SUBSTR 调用的语法是相同的,所以我怀疑它会起作用:

regexp_substr('AA||CCCCCCCC|||FFFFFFFFFFF', '(.*?)(\||$)', 1, 6, 'c', 1)

编辑:'c' 区分大小写