您的正则表达式在这里显示不正确。请记住,.* 和 .+ 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(将它们视为简单字符),以及使用反括号表达式[^${}] 将接受除字符$、{ 或} 之外的任何内容,一旦匹配器在潜在变量中进行搜索。
末尾的额外$ 指令仅过滤始终以问号结尾的文本,如果问号不是每次都在数据中终止字符串,则可以删除。
如果可以存在多个变量,您也可以扩展它以匹配(和/或捕获)多个变量:
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 等网站上构建和理解您自己的正则表达式模式interactively with a list of questions 进行测试,这样会更容易。