给定字符串12,.34.56
我需要按点(.
)拆分此字符串,但仅限于这些点,前一个字符不是逗号(,
)
也就是说,从上面的字符串开始,必须检索结果
12,.34
56
我正在尝试这个:
SELECT regexp_split_to_table('12,.34.56', E'[^,]\\\.')
返回:
12,.3
56
如我们所见,符号4
已删除,理解原因:[^,]
表示除逗号外的“某些符号”,在这种情况下,“某些符号”已转为4
问题:如何防止这种情况?如何不包括这篇文章:[^,]
in pattern?
答案 0 :(得分:2)
这称为负面后瞻断言。不幸的是PostgreSQL doesn't support these in its regular expression implementation。
你可以通过使用更复杂的查询来解决这个问题......正如Erwin刚刚发布的那样,我正在写这篇文章。
虽然PostgreSQL的本机regexp实现不支持此功能,但 pl / perl会,因此当您找不到更简单,更高效的时候,可以使用PL / Perl执行更复杂的正则表达式任务使用PostgreSQL内置函数的变通方法。
答案 1 :(得分:2)
由于Postgres正则表达式不支持此功能,因此解决方法是将,.
替换为另一个(唯一)字符组合,然后将其转换回来:
SELECT replace(unnest(string_to_array(
replace('12,.34.56.78,.34', ',.','~^~'), '.')), '~^~', ',.')
我也在使用unnest(sting_to_array())
代替regexp_split_to_table()
,因为它已经证明可以更好地扩展。