正则表达式提取由管道分隔的字符串的第 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
元素,等等
^(?:[^|]*\|){5}\K[^|]*
或者,如果您的正则表达式引擎不支持 \K
,您可以使用以下内容(第一个捕获组中的结果):
^(?:[^|]*\|){5}([^|]*)
说明
^
在行首声明位置
(?:[^|]*\|){5}
恰好匹配以下5次
[^|]*
匹配除 |
之外的任何字符任意次数
\|
按字面匹配 |
\K
重置比赛的起点。任何之前消耗的字符不再包含在最终匹配中
[^|]*
匹配除 |
之外的任何字符任意次数
对于 DB2,请尝试使用此方法获取列表中的第 6 个元素。这适用于 Oracle 并允许 NULL 列表元素。 REGEXP_SUBSTR 调用的语法是相同的,所以我怀疑它会起作用:
regexp_substr('AA||CCCCCCCC|||FFFFFFFFFFF', '(.*?)(\||$)', 1, 6, 'c', 1)
编辑:'c' 区分大小写
我是正则表达式的新手
我需要从以下示例文本中计算并提取标记:
AA||CCCCCCCC|||FFFFFFFFFFF
请求第 4 个令牌我必须得到一个空的 '' 字符串,请求第 6 个我必须得到 'FFFFFFFFFFF'
是否可以有这样的正则表达式?
提前致谢!
PS:对于令牌计数,我使用 '\|'
将 +1 添加到结果是字符串不为空,当然还有另一种更有效的方法来做到这一点仅使用正则表达式...
在 |
上拆分字符串会更有效,但这也有效。
代码
我们将大括号中的数字称为计数器 {X}
。该计数器从 0 开始。如果它设置为 0
,我们将获得 1st
元素,如果它设置为 5
,我们将获得 6th
元素,等等
^(?:[^|]*\|){5}\K[^|]*
或者,如果您的正则表达式引擎不支持 \K
,您可以使用以下内容(第一个捕获组中的结果):
^(?:[^|]*\|){5}([^|]*)
说明
^
在行首声明位置(?:[^|]*\|){5}
恰好匹配以下5次[^|]*
匹配除|
之外的任何字符任意次数\|
按字面匹配|
\K
重置比赛的起点。任何之前消耗的字符不再包含在最终匹配中[^|]*
匹配除|
之外的任何字符任意次数
对于 DB2,请尝试使用此方法获取列表中的第 6 个元素。这适用于 Oracle 并允许 NULL 列表元素。 REGEXP_SUBSTR 调用的语法是相同的,所以我怀疑它会起作用:
regexp_substr('AA||CCCCCCCC|||FFFFFFFFFFF', '(.*?)(\||$)', 1, 6, 'c', 1)
编辑:'c' 区分大小写