我需要一个正则表达式来提取定界符之间的特定字符

时间:2018-08-20 05:09:15

标签: regex google-bigquery

我需要一个正则表达式来提取定界符之间的特定字符,该特定字符为〜而定界符为“。

这是一些示例文本:

~104.7866 ~"~A.SITI FATONAH "~2014/06/23

0.0 ~ 0.0 ~"ENI NURLINI ( 341676 ) ~ "~2016/05/18

我要删除两个“之间的〜,因此输出为

~104.7866 ~"A.SITI FATONAH "~2014/06/23

0.0 ~ 0.0 ~"ENI NURLINI ( 341676 )  "~2016/05/18

我打算在sql中使用regex_replace替换〜,但我找不到正确的regex

2 个答案:

答案 0 :(得分:1)

以下示例适用于BigQuery标准SQL

#standardSQL
WITH `project.dataset.table` AS (
  SELECT '~104.7866 ~"~A.SITI FATONAH "~2014/06/23' str UNION ALL
  SELECT '0.0 ~ 0.0 ~"ENI NURLINI ( 341676 ) ~ "~2016/05/18' 
)
SELECT REGEXP_REPLACE(str, r'("[^"]*)~([^"]*")', r'\1\2')
FROM `project.dataset.table`     

答案 1 :(得分:0)

如果可以确定字符串上只有两个",则可以使用与此类似的东西(我使用Oracle进行测试,但是几乎所有dbms都应具有concat,substr和intstr类似的功能)

SELECT 
col as col_before,
concat(
substr(col, 1, instr(col, '"')),
concat(
regexp_replace(substr(col, 1+instr(col, '"'), instr(col, '"', 1+instr(col, '"'))-instr(col, '"')-1), '~', ''), 
substr(col, instr(col, '"', 1+instr(col, '"')))
)) as col_after


FROM (SELECT '0.0 ~ 0.0 ~"ENI NU~RLIN~I ( 341676 ) ~"~2016/05/18' as col FROM DUAL WHERE 1=1) t
WHERE 1=1

基本思想是将字符串分成3个部分,搜索"。然后将~替换为中间的~,然后再次合并3个片断。

这甚至可以用于多个COL_BEFORE = 0.0 ~ 0.0 ~"ENI NU~RLIN~I ( 341676 ) ~"~2016/05/18 COL_AFTER = 0.0 ~ 0.0 ~"ENI NURLINI ( 341676 ) "~2016/05/18

~

仅供参考,如果引擎将支持PCRE正则表达式,则该正则表达式也可能起作用,甚至删除了多个> Step 1: Test Case 1: Add an Account > Step 2: UPDATE database and set a field of Account table to verified > Step 3: Test Case 2: View Account (?:(?:^[^"\n]*)")?\K([^"~\n]*)~?(?=.*")

无论如何,似乎Google查询uses re2 engine。从lookahead is not supported on re2开始。您必须坚持第一种方法。