Big Query Regex:匹配一组单词中的所有内容

Big Query Regex: Match all from a set of words

我正在使用 REGEXP_EXTRACT_ALL(column_with_text, r'(\bword1\b|\bword2\b|\bword3\b)') as matching_words 提取文本中任意位置的 3 个单词中的任何一个,而不考虑顺序和大小写。

对于以下文字:
here random word here word2 or here word1 random words 它提取了 word1 和 word2,这很好。

但是,对于另一个查询,如果所有这三个词都出现在文本中,我想提取这些词,同样不考虑顺序和大小写。我正在尝试: REGEXP_EXTRACT_ALL(column_with_text, r'(\bword1\b)(\bword2\b)(\bword3\b)').

对于以下文字:
here random word here word2 or here word1 random words 它应该 return 什么都没有,因为文本不包含 word3。但它应该 return 所有三个词,如果文本是:here word3 for example random word here word2 or here word1 random words

这会在 Big Query 中引发以下错误:

传递到提取函数的正则表达式不能有超过 1 个捕获组

您可以为此编写自己的函数 - 例如

create temp function regexp_extract_only_if_all(text string, regexp string) as ((
  select if(array_length(arr) = cnt, arr, null) from 
  (select regexp_extract_all(text, r'' || regexp) arr, array_length(regexp_extract_all(regexp, r'\|')) + 1 cnt)
));
with your_table as (
  select 'here random word here word2 or here word1 random words' column_with_text union all
  select 'here word3 for example random word here word2 or here word1 random words'
)
select column_with_text, 
  regexp_extract_only_if_all(column_with_text, r'\bword1\b|\bword2\b|\bword3\b') as extracts
from your_table    

有输出