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,发出转义引号的主要内容,如果未能解决你的问题,请参考以下文章