RegExp 从管道分隔的字符串中提取值

Posted

技术标签:

【中文标题】RegExp 从管道分隔的字符串中提取值【英文标题】:RegExp extract value from pipe delimited string 【发布时间】:2019-10-29 14:15:31 【问题描述】:

我对 regexp 函数很陌生,想要一些建议。 我有一个包含管道分隔值的字段,并希望根据另一个值的位置提取一个值。 这样做的原因是我想要的值并不总是设置,但总是倾向于排在另一个值的第 5 位。希望到目前为止我说得通。

这里是字符串的一个例子:

|XYZ|CBA|365|15841.25|43.40|20171202|20181201|365|17024.94|46.64||20171202|20181201|365|17024.94|46.64||0.00|546.18|0000|

我想提取粗体和斜体的数字 - 546.18,它往往出现在第三个“365”之后的第 5 位,或者从下往上的第一个 365,这是我更喜欢的。

我已尝试反转字符串并获取 365 的第一个实例

第一步——反转字段(内容) 反向(内容)作为 content_rev

第二步 - 从 563 的第一个实例中恢复前 55 个字符并将字符串反转回原始

reverse(substr(content_rev, instr(content_rev, '\|563\|')-50, 55)) as extract_content

输出如下所示: |365|17024.94|46.64||0.00|546.18|8528|02|0540023096|2|2

从这一点上不确定如何获得突出显示的值

我确信这种方式不是最有效的方法,所以如果有人有更好的方法来获得结果,将不胜感激。

【问题讨论】:

461.01 另外,您使用的是 mysql 还是 Hive?它们不是一回事。 对不起,我使用 hive sql,我更正了应该是 546.18 的数字 【参考方案1】:

使用 | 分割作为分隔符并取第 5 个元素。

split(your_string, '\\|')[5]

your_string 是你使用反向等得到的:|365|17024.94|46.64||0.00|546.18|8528|02|0540023096|2|2

【讨论】:

以上是关于RegExp 从管道分隔的字符串中提取值的主要内容,如果未能解决你的问题,请参考以下文章

基于分隔符提取字符串的正则表达式

从管道分隔文件中获取值

Regexp_replace :从 Oracle 中的“+”分隔字符串中删除重复项 [重复]

通过删除 Laravel 中的多余字符,从斜杠分隔的 url 中提取参数值

Oracle REGEXP_SUBSTR |获取两个分隔符之间的字符串

spark.sql() 的 REGEXP_REPLACE