用于特殊字符的REGEX(解码Unicode)

时间:2017-11-16 05:47:42

标签: unicode google-bigquery

我已尝试此代码进行解码,如果注释以任何特殊字符,符号,空格等开头显示错误,则unicode一切正常。

      CREATE TEMP FUNCTION DecodeUnicode(s STRING) AS (
      IF(s NOT LIKE '%\\u%', s,
      (SELECT CODE_POINTS_TO_STRING(ARRAY_AGG(CAST(CONCAT('0x', x) AS INT64)))
      FROM UNNEST(SPLIT(s, '\\u')) AS x
      WHERE x != ''))
      );

      SELECT
      original,
      DecodeUnicode(original) AS decoded
      FROM (
      SELECT trim(r'$-\u6599\u91d1\u304c\u9ad8\u3059\u304e\uff01\uff01\uff01') AS original UNION ALL
      SELECT trim(r'abcd')
      );

1 个答案:

答案 0 :(得分:1)

以下是BigQuery Standard SQL

   
#standardSQL
CREATE TEMP FUNCTION DecodeUnicode(s STRING) AS (
  (SELECT CODE_POINTS_TO_STRING(ARRAY_AGG(CAST(CONCAT('0x', x) AS INT64)))
  FROM UNNEST(SPLIT(s, '\\u')) AS x
  WHERE x != ''
  )
);
WITH `yourTable` AS (
  SELECT r'$-\u6599\u91d1\u304c\u9ad8\u3059\u304e\uff01\uff01\uff01' AS original UNION ALL
  SELECT r'abcd'
), uchars AS (
  SELECT DISTINCT
    c,
    DecodeUnicode(c) uchar
  FROM `yourTable`, 
  UNNEST(REGEXP_EXTRACT_ALL(original, r'(\\u[abcdef0-9]{4})')) c
)
SELECT
  original,
  STRING_AGG(IFNULL(uchar, x), '' ORDER BY pos) decoded
FROM (
  SELECT 
    original, 
    pos,
    SUBSTR(original, 
      SUM(CASE char WHEN '' THEN 1 ELSE 6 END) 
        OVER(PARTITION BY original ORDER BY pos) - CASE char WHEN '' THEN 0 ELSE 5 END, 
      CASE char WHEN '' THEN 1 ELSE 6 END) x,
    uchar
  FROM `yourTable`,
  UNNEST(REGEXP_EXTRACT_ALL(original, r'(\\u[abcdef0-9]{4})|.')) char WITH OFFSET AS pos
  LEFT JOIN uchars u ON u.c = char
)
GROUP BY original
-- ORDER BY original    

它做什么 - 它提取所有unicode字符并解码它们并用原始字符串替换它们,使非unicode保持不变,因此输出将如下所示

original                                                    decoded  
$-\u6599\u91d1\u304c\u9ad8\u3059\u304e\uff01\uff01\uff01     $-料金が高すぎ!!!     
abcd                                                        abcd