RegEx - 正向后视中的可选子字符串

Posted

技术标签:

【中文标题】RegEx - 正向后视中的可选子字符串【英文标题】:RegEx — Optional substring in positive lookbehind 【发布时间】:2020-05-12 00:04:11 【问题描述】:

我正在使用 Redshift 的 stl_querystl_load_commits 查询中选择 querytxt。我想使用 RegEx 转换 querytxt 列以获取架构和表名。

我有一些类似以下的查询:

    COPY schema.table ... COPY ANALYZE schema.table ... copy schema.table ... copy analyze schema.table .. copy table ...

我想通过忽略COPYANALYZE 并在COPY (或ANALYZE 如果存在)之后获取schemaschema.table 来使用正则表达式从字符串的开头进行匹配。 COPYANALYZE 匹配需要不区分大小写。

所以结果是:

    schema.table scehma.table schema.table schema.table table

我希望这样的事情能奏效,但事实并非如此:(?<=^COPY (?:ANALYZE ))\S*

奖金

我有一个这样的字符串:

copy "schema"."table" ...

之前的 RegEx 解决方案应该找到 "schema"."table",但如果它可以选择 schema.table,那就太好了!

【问题讨论】:

请用您正在使用的数据库标记您的问题。正则表达式函数是特定于供应商的。 除非你有特定的数据库,否则“sql”是不合适的。尤其如此,因为并非所有数据库都支持正则表达式,而且那些支持正则表达式的数据库通常有不同的实现。 【参考方案1】:

您可以在此处使用带有一些可选逻辑的捕获组:

\bCOPY (?:ANALYZE )?((?:\S+?\.)?\S+)

请在不区分大小写模式下使用正则表达式。

如果您想在 SQL 查询中提取此信息,您可以尝试以下操作:

SELECT REGEXP_REPLACE(LOWER(query), '^copy (analyze )?(\\S+).*$', '$2')
FROM yourTable;

Demo

【讨论】:

这行得通!对于我的用例,能够将其修剪为\bCOPY (?:ANALYZE )?(\S+)。但不确定如何在 Redshift 中使用这个 RegEx?好像 Redshift 不支持环视? regex101.com/r/C6Ulrg/3 您不能在 Redshift 正则表达式中使用环视。我以为你只是在使用一些文本编辑器来解析 SQL 代码。 无赖...我想我可能不得不单独导出和解析。感谢您的信息! @hcas 检查我更新的 Redshift 查询答案,您可以使用它来提取表或模式表名称。演示是在 Postgres 中(我能做到的最好的),所以语法有一点变化。 收到此错误:[XX000] ERROR: Invalid preceding regular expression prior to repetition operator. The error occurred while parsing the regular expression fragment: 'copy (?>>>HERE>>>:analyze )'.。也许这是相关的:***.com/questions/41022295/…【参考方案2】:

(?i)^\s+COPY\s+(?:ANALYZE\s+)?("?)([^"]+)\1\.([^"]?)(\S+)\2 并在比赛中寻找第 2 组和第 4 组。

不区分大小写。在行首之后找到任何空格,然后是单词“COPY”和至少一些空格,然后是可选的“analyze”加上任何空格,然后可能是一个被引号包围的单词,然后是一个文字点,然后是另一个被引号包围的单词。

【讨论】:

这似乎不起作用? regex101.com/r/VO9fww/1 (?i)^\s*COPY\s+(?:ANALYZE\s+)?("?)([^."]+)\1\.("?)([^"\s]+)\3 由于环顾而无法在红移中工作,但感谢详细的正则表达式响应! 什么是环视?这里没有零宽度的前瞻或后瞻断言。

以上是关于RegEx - 正向后视中的可选子字符串的主要内容,如果未能解决你的问题,请参考以下文章

验证字符串以仅包含限定字符和中间的特定可选子字符串

CUDA、Boost 和 Cmake “字符串子命令 REGEX,模式 MATCHALL 需要至少 5 个参数来命令。”

Educational Codeforces Round 110 (Rated for Div. 2) - C. Unstable String - DP

SyntaxError: (irb):4: 后视模式无效(正向后视/前瞻)

WCF中URITemplate中的可选查询字符串参数?

C# (.net) RegEx.Match 换行符之间的子字符串 - 使用换行符作为正向超前限制