【问题标题】:I need a regex to extract a specific character between delimiter我需要一个正则表达式来提取分隔符之间的特定字符
【发布时间】:2018-08-20 05:09:14
【问题描述】:

我需要一个正则表达式来提取分隔符之间的特定字符,特定字符是~,分隔符是"。

这是一些示例文本:

~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 来替换 ~ 但我找不到合适的正则表达式

【问题讨论】:

  • 引号内可以有多个~s吗?
  • @CertainPerformance 确定,棘手的情况是一对".." 引号内有多个~s;否则用"$1$2" 替换"([^~]*)~([^~]*)" 就足够了[我说的是regex 一般;从未使用过nsregularexpression]
  • 还有一个问题是输入看起来像这样a"b"c"d"。您会认为 c 包含在引号内吗?因为从技术上讲,它不是。
  • @CertainPerformance 引号内只有一个 ~
  • 是Oracle SQL吗? PostgreSQL?微软 SQL?在前两个的情况下,"(.*)~(.*)" => \1\2 如果字符串中只有一对引号并且总是有 1 个 ~ 可以删除。

标签: regex google-bigquery


【解决方案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`     

【讨论】:

    【解决方案2】:

    如果你可以确定字符串上只有两个",你可以使用类似的东西(我使用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 正则表达式,这个正则表达式也可以工作,甚至删除几个 ~ (?:(?:^[^"\n]*)")?\K([^"~\n]*)~?(?=.*")

    无论如何,谷歌似乎查询uses re2 engine。所以自从lookahead is not supported on re2。你必须坚持第一种方法。

    【讨论】:

      猜你喜欢
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      • 2019-07-02
      • 1970-01-01
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多