【问题标题】:How to "not include" some piece in regex pattern如何在正则表达式模式中“不包含”某些部分
【发布时间】:2013-05-19 12:37:18
【问题描述】:

给定字符串12,.34.56

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

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

12,.34
56

我正在尝试这个:

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

返回:

    12,.3
    56

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

问题:如何预防?如何不包括这块:[^,] 模式?

【问题讨论】:

  • 这将是正则表达式:/(?<!,)\./。但是,我不确定 PostgreSQL 是否支持。
  • 感谢您的回答。

标签: regex postgresql postgresql-9.2


【解决方案1】:

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

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

我也在使用unnest(sting_to_array()) 而不是regexp_split_to_table(),因为它的扩展性更好。

【讨论】:

    【解决方案2】:

    这称为否定的后向断言。不幸的是PostgreSQL doesn't support these in its regular expression implementation

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

    虽然 PostgreSQL 的原生 regexp 实现不支持这一点,但 pl/perl 支持,所以当你找不到更简单和更高效的时候,你可以使用 PL/Perl 来执行更复杂的正则表达式任务使用 PostgreSQL 内置的解决方法。

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 2021-10-21
      • 1970-01-01
      • 2017-07-25
      • 2022-08-18
      • 2017-05-10
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多