当我在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。
谢谢!
答案 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'
搜索包含元字符的字符串,例如。 * | ? ’,依此类推,请使用两个反斜杠('\\')对字符进行转义。