【问题标题】:Regex to extract nth token of a string separated by pipes正则表达式提取由管道分隔的字符串的第 n 个标记
【发布时间】:2018-01-16 15:54:41
【问题描述】:

我是正则表达式的新手

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

AA||CCCCCCCC|||FFFFFFFFFFF

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

有可能有这样的正则表达式吗?

提前致谢!

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

【问题讨论】:

  • 只需在您的编程语言中对| 进行分解/拆分,这样会容易得多。
  • 您在使用什么操作系统/RDBMS/程序或编辑器?并非所有版本的正则表达式都是一样的。请更新要显示的标签。
  • 我将使用 DB2 REGEXP_COUNTREGEXP_SUBSTR 标量函数。
  • 加倍努力:是否有可能获得具有特定价值的第一个令牌? 'CCCCCCCC' -> 3 , 'FFFFFFFFFFFF' -> 6

标签: regex db2 db2-400


【解决方案1】:

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

代码

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

See regex in use here

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

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

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

说明

  • ^ 在行首断言位置
  • (?:[^|]*\|){5} 准确匹配以下 5 次
    • [^|]* 匹配除| 以外的任何字符任意次数
    • \| 匹配 | 字面意思
  • \K 重置比赛的起点。任何先前使用的字符都不再包含在最终匹配中
  • [^|]* 匹配除| 以外的任何字符任意次数

【讨论】:

  • 感谢您的解释!
【解决方案2】:

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

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

编辑:'c' 区分大小写

【讨论】:

    猜你喜欢
    • 2019-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 2023-03-15
    相关资源
    最近更新 更多