Postgres正则表达式和regexp_split_to_array

scr*_*his 7 regex postgresql

在postgresql中,我需要提取给定列的值中的前两个单词.因此,如果价值是"hello world moon and stars"或"hello world moon",或者甚至只是"hello world",我需要"he​​llo world".

我希望使用,regexp_split_to_array但似乎我不能使用它并访问在同一查询中返回的元素?

我是否需要为我正在尝试的内容创建一个函数?

VGe*_*rge 10

我无法相信5年前,如果用括号括起来,没有人注意到你可以访问regexp_split_to_array函数中的元素.

我看到很多人试图像这样访问表的元素:

select regexp_split_to_array(my_field, E'my_pattern')[1] from my_table
Run Code Online (Sandbox Code Playgroud)

前一个将返回错误,但以下不会:

select (regexp_split_to_array(my_field, E'my_pattern'))[1] from my_table
Run Code Online (Sandbox Code Playgroud)


mu *_*ort 8

你可以在PostgreSQL中使用POSIX正则表达式substring():

select substring('hello world moon' from E'^\\w+\\s+\\w+');
Run Code Online (Sandbox Code Playgroud)

或者对一个单词的含义进行非常自由的解释:

select substring('it''s a nice day' from E'^\\S+\\s+\\S+');
Run Code Online (Sandbox Code Playgroud)

注意\S(非空格)而不是\w("单词"字符,基本上是字母数字加上下划线).

不要忘记所有额外的引用废话:

  • E''告诉你使用PostgreSQL 扩展逃逸.
  • 然后使用双反斜杠将单个反斜杠传递给字符串解析器并进入正则表达式解析器.

如果你真的想使用regexp_split_to_array,那么你可以,但上述引用问题适用,我认为你只想切掉数组的前两个元素:

select (regexp_split_to_array('hello world moon', E'\\s+'))[1:2];
Run Code Online (Sandbox Code Playgroud)

我猜测逃跑造成了一些混乱; 我通常最后添加反斜杠直到它工作,然后我挑选它,直到我理解为什么我需要我最终使用的反斜杠的数量.或许额外的括号和数组切片语法是一个问题(这对我而言,但一些实验将其整理出来).


scr*_*his 2

找到了一个答案:

select split_part('hello world moon', ' ', 1) || ' ' || split_part('hello world moon', ' ', 2);
Run Code Online (Sandbox Code Playgroud)