Your regular expression appears incorrect here. Keep in mind that pattern matchers such as .*
and .+
are greedy and will match more character types than you may have intended. Also, the [${]
and [}?]
bracket expressions in your regex is indicating match either $
or {
, and }
or ?
respectively, which is not what you are intending to perform.
If your goal is simply to find all text that conforms to the below form specifically:
Does every question end with a question-mark immediately after the ${variable}?
Then a fitting pattern for it in Snowflake SQL could be:
select question
from "<table_name>"
where question regexp '.*\\$\\{[^${}]+\\}\\?$';
Notice the double-backslashing (\\$
, \\{
, etc.) to disallow treating $
and {
as regular expression instructions (to treat them as simple characters), and the use of an inverted bracket expression [^${}]
which will accept anything except the characters $
, {
, or }
once the matcher is searching within a potential variable.
The extra $
instruction at the end is to filter only for text that always ends in a question-mark, and can be dropped if a question-mark does not terminate the string every time in your data.
You can extend this to match (and/or capture) multiple variables too, if more than one variable can be present:
select
question
,regexp_substr(question, '(\\$\\{[^${}]+\\})', 1, 1) variable_1
,regexp_substr(question, '(\\$\\{[^${}]+\\})', 1, 2) variable_2
from "<table_name>"
where question regexp '.*(\\$\\{[^${}]+\\}).*\\?.*'
The above will match also for question strings such as:
Does this question ${carry} two ${variables}?
I recommend building and understanding your own regular expression pattern interactively with a list of questions to test against, on websites like Regex101, RegExr, etc. that make it easier.