【问题标题】:Avoiding Lookbehind in Postgres在 Postgres 中避免向后看
【发布时间】:2014-08-22 09:39:45
【问题描述】:

在我编写的 Postgres 查询中,我试图在数字和字符之间找到一个空字符。

原始数据看起来与此非常相似:

“X 1111-11-112222-22-22YY 3333-33-334444-44-44ZZZ5555-55-556666-66-66AAA7777-77-778888-88-88B 9999-99-991111-11-11”

我想把它分成下表:

X 1111-11-112222-22-22 YY 3333-33-334444-44-44 ZZZ5555-55-556666-66-66 AAA7777-77-778888-88-88 B 9999-99-991111-11-11

所以,通常我会通过定义正则表达式 (?<\d)(?=[A-z]) 来做到这一点,这给了我字符和数字之间的空字符,但 Postgres 不支持后向查找。

有人知道如何解决这个问题吗?

提前致谢!

【问题讨论】:

  • 第一,没想到第二,sry。

标签: sql regex postgresql split lookbehind


【解决方案1】:
 (\w+\s*[\d-]+)

这将给出所有组。参见演示。

http://regex101.com/r/nW8dX7/1

【讨论】:

  • 所以如果我理解正确的话,你是在提取 XXX1111-11-112222-22-22 的块?
  • 好的,因为实际的 Data 由这种类型的块组成,由 10 或 13(或者,如果组合,则为 23)空格分隔,这些空格也是用 this 提取的。我试过一个非贪婪的版本,但我仍然坚持空白。有什么想法吗?
  • (\w+\s*[\d-]+)\s* 试试这个。
  • 即使是非贪婪版本,仍然会留下空白。
  • regex101.com/r/nW8dX7/3 看看这个。不知道为什么你的不工作
【解决方案2】:

我会用一个你以后可以拆分的字符来替换。我不熟悉 psql 但类似:

split('~', replace(value, '\d(?=[A-z])', '$0~'))

【讨论】:

  • 这是我已经在做的,仍然在数字前面插入字符,将其转移到下一个块
  • 你能发布那个代码吗?这似乎很奇怪,因为这个 sn-p 明确告诉替换将 ~ $0之后。
猜你喜欢
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-24
相关资源
最近更新 更多