0

给定字符串 12,.34.56

我需要按点 () 拆分此字符串.,但仅按这些点,前一个字符不是逗号 ( ,)

也就是说,从上面的字符串,必须是检索结果

12,.34
56

我正在尝试这个:

SELECT regexp_split_to_table('12,.34.56', E'[^,]\\\.')

这返回:

    12,.3
    56

如我们所见,符号4被删除,原因被理解:[^,]表示除逗号之外的“某个符号”,在这种情况下,“某个符号”被翻转4

问题:如何防止这种情况?如何不包括这件作品:[^,]在模式中?

4

2 回答 2

2

这称为否定后向断言。不幸的是,PostgreSQL 在其正则表达式实现中不支持这些

您可以通过使用更复杂的查询来解决这个问题……正如 Erwin 刚刚发布的那样,我正在写这篇文章。

虽然 PostgreSQL 的本机正则表达式实现不支持这一点,但pl/perl支持,因此当您找不到使用 PostgreSQL 内置的更简单和更有效的解决方法时,您可以使用 PL/Perl 执行更复杂的正则表达式任务。

于 2013-05-19T12:57:03.393 回答
2

由于 Postgres 正则表达式不支持这一点,解决方法是,.用另一个(唯一)字符组合替换,然后再将其转换回来:

SELECT replace(unnest(string_to_array(
               replace('12,.34.56.78,.34', ',.','~^~'), '.')), '~^~', ',.')

我也在使用unnest(sting_to_array()),而不是regexp_split_to_table()因为它已经证明可以更好地扩展。

于 2013-05-19T12:57:15.677 回答