Как вернуть только одну группу соответствия регулярному выражению? - PullRequest
0 голосов
/ 20 марта 2019

У меня есть регулярное выражение с несколькими группами совпадений.

Как в снежинке указать, какую группу совпадений вернуть?

Я использую REGEXP_SUBSTR, но с удовольствием использую альтернативы, если они работают лучше.

Ответы [ 2 ]

3 голосов
/ 23 марта 2019

TL; DR: не может точно это сделать, но вы можете выбрать опцию 'e' и использовать группы без захвата с (?:re).

Итак, чтобы уточнить, похоже, Нил просит что-то, что вернуло бы word для

select regexp_substr('bird is the word','(bird) (is) (the) (word)',1,4)

К сожалению, я не думаю, что Snowflake поддерживает точно эту функциональность сегодня. Для REGEXP_SUBSTR существует параметр 'e' (extract), который позволяет извлекать только группу, но всегда извлекает first group. Причина этого заключается в том, что сегодня параметр occurrence означает вхождение всего регулярного выражения в строку . Пример * * тысяча двадцать пять

select regexp_substr('bird is cows are','([a-z]*) (is|are)',1,2,'e');
=> cows

Вы можете достичь того, чего хотите, не используя группирование по группам до того, что хотите, например

select regexp_substr('bird is the word','bird (is) (the) (word)',1,1,'e');
-> is
select regexp_substr('bird is the word','bird is the (word)',1,1,'e');
-> word

Однако это не сработает, если вы хотите использовать группирование для выражения альтернатив, например,

select regexp_substr('cow is the word','(bird|cow) is the (word)',1,1,'e');
-> cow

Затем вы можете использовать без захвата группировки синтаксис для регулярных выражений, используя (?:re) синтаксис

select regexp_substr('cow is the word','(?:bird|cow) is the (word)',1,1,'e');
-> word
select regexp_substr('cow is the word','(?:bird|cow) (?:is) (?:the) (word)',1,1,'e');
-> word

Тем не менее, я вижу, что было бы полезно предоставить опцию для извлечения определенного номера группы, повысит его при разработке Snowflake:)

0 голосов
/ 22 марта 2019

В документации есть параметр с именем occurance, который позволяет указать, какое совпадение будет возвращено.

Например:

select regexp_substr('bird is the word','\\w+',1,1); -- returns "bird"
select regexp_substr('bird is the word','\\w+',1,4); -- returns "word"
...