RegEx SQL,发出转义引号

Posted

技术标签:

【中文标题】RegEx SQL,发出转义引号【英文标题】:RegEx SQL, issue escaping quotes 【发布时间】:2014-04-17 14:46:33 【问题描述】:

我正在尝试使用 PSQL,特别是 AWS Redshift 来解析一行。示例数据如下

"c.1.mcc":"250","appId":"sx-calllog","b.level":59,"c.1.mnc":"01"
"appId":"sx-voice-call","b.level":76,"foreground":9

我正在尝试以下正则表达式以提取 appId 字段,但我的查询返回空字段。

'appId\":\"[\w*]\",'

查询

SELECT app_params,
   regexp_substr(app_params, 'appId\":\"[\w*]\",')
FROM sample;

【问题讨论】:

【参考方案1】:

你可以这样做:

(\"appId\":\"[^"]*\")(?:,)

演示:http://regex101.com/r/xP0hW3

第一个提取的组就是您想要的。 您的正则表达式不匹配,因为 \w 确实 not 匹配 -

【讨论】:

我认为我不能使用 redshift 选择提取组。但我现在返回了 "appId":"blah" 所以这是一个很大的改进。【参考方案2】:

尽管这是一个老问题,但仍将其添加到此处,因为它可能会帮助人们在路上查看此内容...

如果您的数据行是有效 json,您可以使用 Redshift 的JSON_EXTRACT_PATH_TEXT 函数来提取给定键的值。强调 json 是有效的,因为即使一行无法解析也会失败,Redshift 会抛出 JSON 解析错误。

使用给定数据的示例:

select json_extract_path_text('"c.1.mcc":"250","appId":"sx-calllog","b.level":59,"c.1.mnc":"01"','appId');

返回sx-calllog

这特别有用,因为 Redshift 不支持前瞻/后瞻(它是 POSIX 正则表达式)和提取组。

【讨论】:

【参考方案3】:

您可以尝试使用一些前瞻和后瞻来隔离 appid 引号内的文本。 (?<=appId\":\")(?=.*\",)[^\"]*。我使用您提供的示例对此进行了一些测试here。

更多解释正则表达式:(?<=appId\":\")(?=.*\",)[^\"]*

    (?<=appId\":\"):积极关注appid":"。由于您不希望返回 appid 文本本身(仅返回值),因此您可以在正则表达式前面加上后面的“查找我下面的正则表达式,但仅当它遵循文本后面的查找时。” (?=.*\",):积极期待结局",。您不希望在匹配中返回引号,但与数字 1 一样,您希望您的正则表达式有一点界限,并且向前看就可以了。 [^\"]*:实际匹配部分。您想查找不是" 的字符串。这将匹配整个值并在结束 " 之前停止匹配。

编辑:稍微改变了第三步,从最后一块中删除了,,它不是必需的,如果值实际上包含,,则会破坏匹配。

【讨论】:

以上是关于RegEx SQL,发出转义引号的主要内容,如果未能解决你的问题,请参考以下文章

Java Regex 用于将带引号的字符串与转义引号匹配

Spark SQL 读取已转义双引号的 JSON 文件

使用正则表达式转义单引号字符串中的所有双引号 [重复]

sql注入逃逸双引号转义

存储过程中执行sql语句时如何转义双引号?

为啥SQL支持两个单引号以及反斜杠转义