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

Posted

技术标签:

【中文标题】我需要一个正则表达式来提取分隔符之间的特定字符【英文标题】: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 个 ~ 可以删除。 【参考方案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。你必须坚持第一种方法。

【讨论】:

以上是关于我需要一个正则表达式来提取分隔符之间的特定字符的主要内容,如果未能解决你的问题,请参考以下文章

Ruby 正则表达式

C# 正则表达式匹配具有分隔符的字符串

Perl 正则表达式匹配分隔字符串

mysql 中用正则表达式如何取一个字符串中指定的字段,

正则表达式截取两个指定字符串之间的内容都有哪些?

Java使用正则表达式提取字段分隔的子字符串