【发布时间】:2019-11-04 07:25:31
【问题描述】:
我有一个 | 分隔的字符串,其中包含 20 个 |s,例如 123|1|42|13||94123|2983191|2|98863|...|211| 最多 20 个 |。这是一个 oracle 数据库列。该字符串只有 20 个数字,后跟 |。
我试图从中取出一个字符串,在其中删除位置 4、6、8、9、11、12 和 13 处的数字。此外,需要将位置 16 处的数字移动到位置 4。直到现在,我有一个像
这样的正则表达式select regexp_replace(col1, '^((\d*\|){4})(\d*\|)(\d*\|)(\d*\|)(\d*\|)((\d*\|){2})(\d*\|)((\d*\|){3})((\d*\|){2})(\d*\|)(.*)$', '\1|\4|\6||\9||||||||') as cc from table
这是我卡住的地方,因为 oracle 只支持最多 9 个组的反向引用。有没有办法让这个正则表达式更简单,所以它的组更少并且可以被替换?也欢迎任何替代解决方案/建议。
注意 - 位置计数器从 0 开始,所以上面字符串中的 123 是第 0 个数字。
编辑:示例 -
源字符串
|||14444|10107|227931|10115||10118||11361|11485||10110||11512|16666|||
预期结果
|||16666|10107||10115||||||11512||||
【问题讨论】:
-
该表中是否还有其他列可以唯一标识每一行?
-
@Littlefoot - 是的,这里有一个 id 列
-
您的预期结果似乎与第一个位置 0 不一致,因为在这种情况下,10107 实际上是位置 4 的数字,应该替换为 16666。