RegEx - 正向后视中的可选子字符串
Posted
技术标签:
【中文标题】RegEx - 正向后视中的可选子字符串【英文标题】:RegEx — Optional substring in positive lookbehind 【发布时间】:2020-05-12 00:04:11 【问题描述】:我正在使用 Redshift 的 stl_query
从 stl_load_commits
查询中选择 querytxt
。我想使用 RegEx 转换 querytxt
列以获取架构和表名。
我有一些类似以下的查询:
COPY schema.table ...
COPY ANALYZE schema.table ...
copy schema.table ...
copy analyze schema.table ..
copy table ...
我想通过忽略COPY
和ANALYZE
并在COPY
(或ANALYZE
如果存在)之后获取schema
或schema.table
来使用正则表达式从字符串的开头进行匹配。 COPY
和 ANALYZE
匹配需要不区分大小写。
所以结果是:
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