【问题标题】:In Redshift: (\s|\+) pattern does NOT work, but ([\s]|[\+]) does. Are they the same?在 Redshift 中: (\s|\+) 模式不起作用,但 ([\s]|[\+]) 可以。他们是一样的吗?
【发布时间】:2019-12-25 20:01:08
【问题描述】:

当我在 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。

谢谢!

【问题讨论】:

  • 不确定,但您是否尝试过双重转义反斜杠?
  • 这样做会转义转义字符,因此搜索反斜杠,这不是我需要的。谢谢
  • 没有错误,但它真的有效吗?我怀疑你需要'Web(\\s|\\+)Downloader' 或只是'Web[\\s+]Downloader'

标签: regex pattern-matching amazon-redshift


【解决方案1】:

'Web(\s|\+)Downloader' 字符串文字包含字符串转义序列,\s\+。由于这些字符串转义序列是未知的(\r 是回车,\n 是换行符,但 \s\+ 不存在)反斜杠被删除并且 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

搜索包含元字符的字符串,例如'. * | ? ' 等等,使用两个反斜杠(' \\ ')转义字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    相关资源
    最近更新 更多