在 Redshift 中使用正则表达式来获取匹配模式之前的单词

Posted

技术标签:

【中文标题】在 Redshift 中使用正则表达式来获取匹配模式之前的单词【英文标题】:Using Regular Expressions in Redshift to get the word prior to matched pattern 【发布时间】:2019-10-27 14:33:22 【问题描述】:

使用 Regexp_substring() 查找单词“OF”之前的单词(第一次出现)。以下代码不起作用,因为 Redshift 似乎不支持非贪婪模式匹配。

请帮忙

select regexp_substr('SAFETY COUNCIL OF PALM BEACH COUNTY, INC. ','[[:print:]].*?\\sOF\\s')

Query execution failed

Reason:
SQL Error [XX000]: ERROR: Invalid preceding regular expression prior to repetition operator.  The error occurred while parsing the regular expression fragment: 'rint:]].*?>>>HERE>>>\sOF\s'.
  Detail: 
  -----------------------------------------------
  error:  Invalid preceding regular expression prior to repetition operator.  The error occurred while parsing the regular expression fragment: 'rint:]].*?>>>HERE>>>\sOF\s'.
  code:      8002
  context:   T_regexp_init
  query:     0
  location:  funcs_expr.cpp:189
  process:   padbmaster [pid=74292]
  -----------------------------------------------

  Where: SQL function "regexp_substr" statement 1

我目前正在使用这种破旧的方法,并且认为应该有更好的方法

select 'SAFETY OF COUNCIL OF PALM OF BEACH COUNTY, INC. ' as name, regexp_instr(name,'\\sOF\\s',1) as ind1,substr(name,1,ind1-1) as name_2,regexp_replace(name_2,regexp_substr(name_2,'.*\\s'),'')

【问题讨论】:

Redshift regexp_substr的可能重复 @JohnRotenstein 我不认为它是另一个问题的重复,我已经修改了标题以最好地代表这个问题。谢谢 仅供参考,该链接问题包括一种通过控制贪婪来实现结果的方法。 【参考方案1】:

为了实现这个功能,我通常使用split_part 函数。在 Postgresql 中同样有效。

select split_part('SAFETY COUNCIL OF PALM BEACH COUNTY, INC. ', 'OF',1)

【讨论】:

以上是关于在 Redshift 中使用正则表达式来获取匹配模式之前的单词的主要内容,如果未能解决你的问题,请参考以下文章

Amazon Redshift 中匹配序列数字的正则表达式

Redshift:如何从字符串列表中匹配最长的正则表达式字符串

正则表达式:获取 AWS Redshift 中两个字符串之间的值

Amazon redshift 在字符串正则表达式后获取数字

redshift sql使用正则表达式从字符串中获取第一、第二、第三个值,如下所示

PHP 正则表达式(PCRE)