我有一个名为问题和该字段中的值是您如何看待 ${question_1}?
我想编写一个查询来选择这个值,我认为它将使用正则表达式来做到这一点。下面是查询,但没有得到结果,有人可以帮助我吗?谢谢!
select question
from "<table_name>"
where question regexp '.*s[${].*s[}?].*';
您的正则表达式在此处显得不正确。请记住,模式匹配器(如.*
和.+
(是贪婪的,并且会匹配比您预期的更多的字符类型。此外,正则表达式中的[${]
和[}?]
括号表达式分别指示匹配$
或{
,以及}
或?
,这不是您打算执行的。
如果您的目标只是查找符合以下表单的所有文本:
Does every question end with a question-mark immediately after the ${variable}?
那么在 Snowflake SQL 中适合它的模式可能是:
select question
from "<table_name>"
where question regexp '.*\$\{[^${}]+\}\?$';
请注意双反斜杠(\$
、\{
等(不允许将$
和{
视为正则表达式指令(将它们视为简单字符(,以及使用倒括号表达式[^${}]
,一旦匹配器在潜在变量中搜索,它将接受除字符$
、{
或}
以外的任何内容。
末尾的额外$
指令是仅筛选始终以问号结尾的文本,如果数据中的问号不是每次都终止字符串,则可以删除该文本。
如果可以存在多个变量,您也可以扩展它以匹配(和/或捕获(多个变量:
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}?
我建议在 Regex101、RegExr 等网站上以交互方式构建和理解您自己的正则表达式模式,并列出要测试的问题列表,使其更容易。