雪花特殊字符解析问题寻找解决方案

时间:2020-06-22 17:33:25

标签: snowflake-cloud-data-platform snowflake-schema

我有一个名为问题和值的字段名称,该字段是您如何看待$ {question_1}?

我想编写一个查询来选择此值,并且我认为它将使用正则表达式来做到这一点。以下是查询,但没有得到结果,有人可以帮助我吗?谢谢!

select question
from "<table_name>"
where question regexp '.*\s[${].*\s[}?].*';

1 个答案:

答案 0 :(得分:1)

您的正则表达式在这里似乎不正确。请记住,模式匹配器(例如.*.+ are greedy)将匹配超出预期的字符类型。另外,正则表达式中的[${][}?]方括号表示$ {} ?,这不是您要执行的操作。

如果您的目标只是查找符合以下特定形式的所有文本:

Does every question end with a question-mark immediately after the ${variable}?

然后在Snowflake SQL中适合它的模式可能是:

select question
from "<table_name>"
where question regexp '.*\\$\\{[^${}]+\\}\\?$';

请注意,double-backslashing\\$\\{等)不允许将${视为regular expression instructions(对待它们(例如简单字符),并使用反向括号表达式[^${}],一旦匹配器在一个匹配项中搜索,它将接受除字符${}之外的任何字符。潜在变量。

末尾多余的$指令仅对始终以问号结尾的文本进行过滤,如果问号并非每次都在数据中终止字符串,则可以将其删除。 / p>

如果可以存在多个变量,您也可以扩展它以匹配(和/或捕获)多个变量:

select
   question
  ,regexp_substr(question, '(\\$\\{[^${}]+\\})', 1, 1) variable_1
  ,regexp_substr(question, '(\\$\\{[^${}]+\\})', 1, 2) variable_2
from "<table_name>"
where question regexp '.*(\\$\\{[^${}]+\\}).*\\?.*'

以上内容也适用于以下问题字符串:

Does this question ${carry} two ${variables}?

我建议在interactively with a list of questionsRegex101等网站上构建并了解您自己的正则表达式模式RegExr,以便对其进行测试。