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
有输出
我正在使用 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
有输出