如何在正则表达式模式中“不包含”某些部分

时间:2013-05-19 12:37:18

标签: regex postgresql postgresql-9.2

给定字符串12,.34.56

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

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

12,.34
56

我正在尝试这个:

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

返回:

    12,.3
    56

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

问题:如何防止这种情况?如何不包括这篇文章:[^,] in pattern?

2 个答案:

答案 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(),因为它已经证明可以更好地扩展。