【问题标题】:RegEx SQL, issue escaping quotesRegEx SQL,发出转义引号
【发布时间】: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;

【问题讨论】:

    标签: regex postgresql amazon-redshift


    【解决方案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\":\")(?=.*\",)[^\"]*

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

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

      【讨论】:

        猜你喜欢
        • 2015-09-06
        • 2012-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-30
        • 2023-03-06
        • 2019-01-03
        相关资源
        最近更新 更多