Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex case和ifnull语句-有人能解释下面的代码吗_Regex_Google Bigquery - Fatal编程技术网

Regex case和ifnull语句-有人能解释下面的代码吗

Regex case和ifnull语句-有人能解释下面的代码吗,regex,google-bigquery,Regex,Google Bigquery,谁能解释一下下面的代码。我需要修改它,但在做之前,我想清楚地理解它 CASE IFNULL(UPPER(REGEXP_EXTRACT(title, '(?i:^(?:new[^a-z])?(?:[a-z]{2,3})-([a-z]{2,3})-)')), 'Unknown') WHEN 'BB' THEN 'BUS' WHEN 'MB' THEN 'MIG' ELSE IFNULL(UP

谁能解释一下下面的代码。我需要修改它,但在做之前,我想清楚地理解它

 CASE IFNULL(UPPER(REGEXP_EXTRACT(title, '(?i:^(?:new[^a-z])?(?:[a-z]{2,3})-([a-z]{2,3})-)')), 'Unknown')
 
      WHEN 'BB' THEN 'BUS'
 
      WHEN 'MB' THEN 'MIG'
                                    
 ELSE IFNULL(UPPER(REGEXP_EXTRACT(title, '(?i:^(?:new[^a-z])?(?:[a-z]{2,3})-([a-z]{2,3})-)')), 'Unknown')

 END

希望下面的例子能让你明白

#standardSQL
WITH example AS (
  SELECT 'ab-BB-asd' title UNION ALL
  SELECT 'new1ab-BB-asd' UNION ALL
  SELECT 'xyz-mb-12345' UNION ALL
  SELECT 'abcd-mb -sss' 
)
SELECT title,  
  CASE IFNULL(UPPER(REGEXP_EXTRACT(title, '(?i:^(?:new[^a-z])?(?:[a-z]{2,3})-([a-z]{2,3})-)')), 'Unknown')
    WHEN 'BB' THEN 'BUS'
    WHEN 'MB' THEN 'MIG'
    ELSE IFNULL(UPPER(REGEXP_EXTRACT(title, '(?i:^(?:new[^a-z])?(?:[a-z]{2,3})-([a-z]{2,3})-)')), 'Unknown')
  END result
FROM example   
结果

Row title           result   
1   ab-BB-asd       BUS  
2   new1ab-BB-asd   BUS  
3   xyz-mb-12345    MIG  
4   abcd-mb -sss    Unknown    
正如您在这里看到的,CASE语句从title中提取特定的模式,如果找不到,则为其分配“Unknown” 然后,如果提取的值分别为“BB”或“MB”,则两个When输出“BUS”或“MIG”,否则输出在ELSE中计算的值(在本例中与在本例中完全相同)

现在,关于
regexp_EXTRACT(title,(?i:^(?:new[^a-z])?(?:[a-z]{2,3})-([a-z]{2,3})-)中的提取模式/regexp

首先,它使搜索不区分大小写
?i:
然后,它从标题的开头查看可选文本
(?:new[^a-z])?
,后跟任何一个非字母字符。可选,因为关闭括号后的

由于
(?:…)
构造,它被跳过(未提取)

然后,它查找两个或三个
{2,3}
字母字符
[a-z]
-由于
(?:…)
而被跳过(未提取)的字符

在此之后,代码在
-
之间寻找另外两个或三个字母字符,由
-([a-z]{2,3})
表示,最后是被提取的字符


这就是它的全部功能:o)

谢谢米哈利。你帮了我很多。只有一个问题,对于第四个标题,尽管标题中有mb,为什么结果显示为“未知”。这是因为
d
abc
之后-它应该是一个非字母字符。那么第2行呢。这是newlab-BB。它不是字母
l
,而是数字
1
:o)