在Redshift中:(\ s | \ +)模式不起作用,但([\ s] | [\ +])起作用。他们是一样的吗?

时间:2019-08-20 14:56:17

标签: regex pattern-matching amazon-redshift

当我在Redshift中运行此查询时:

select distinct bot, case when bot ~ 'Web(\s|\+)Downloader' then 1 else 0 end isbot from bots

我收到此错误:

  

无效操作:重复运算符之前的无效前置正则表达式。解析正则表达式片段时出错:'Web(s | + >>> HERE >>>)Downloader'。

但是,当我将正则表达式模式更改为此时:

Web([\s]|[\+])Downloader

然后查询运行无误。

我在这里测试了两种版本的模式:https://regex101.com/

它们的行为似乎相同。

但是我想在这里发布并验证它们是否确实是同一件事,并且恰好适用于Redshift。

谢谢!

1 个答案:

答案 0 :(得分:1)

'Web(\s|\+)Downloader'字符串文字包含字符串转义序列\s\+。由于这些字符串转义序列是未知的(\r是回车符,\n是换行符,但\s\+不存在),反斜杠被删除,并且<字符串文字解析后得出的em> string 为Web(s|+)Downloader。因此,+变成了 1个或更多量词。由于禁止量化交替运算符,因此将引发异常。另外,s开始匹配s,而不是空格。 'Web([\s]|[\+])Downloader'可以正常工作,但与Web Downloader不匹配,但是应该与WebsDownloader匹配,因为引擎将模式解析为Web([s]|[+])Downloader,其中[+]与文字匹配+(因为它在方括号表达式内),并且[s]s匹配。

您需要

'Web(\\s|\\+)Downloader'

或者,

'Web[\\s+]Downloader'

请参见Amazon Redshift docs

  

搜索包含元字符的字符串,例如。 * | ? ’,依此类推,请使用两个反斜杠('\\')对字符进行转义。