如何在REGEXP_REPLACE下工作?

时间:2018-04-26 05:49:33

标签: oracle

我的项目中有查询,而REGEXP_REPLACE 我试图通过搜索找到它是如何工作的,但我发现它像

  

w +匹配单词字符(即字母数字或下划线)   (_)字符)。

但无法找到'"\w+\":'使用这些""的原因以及'{|}|"',''

的含义
UPDATE (SELECT data,data_value FROM  TEMP) t
SET t.DATA_VALUE=REGEXP_REPLACE(REGEXP_REPLACE(t.data, '"\w+\":',''),'{|}|"','');
你能告诉我它是如何运作的吗?

2 个答案:

答案 0 :(得分:1)

这似乎是一个正则表达式,用于从JSON字符串中剥离密钥和括起括号 - 不幸的是,如果是这种情况,那么它在所有情况下都不起作用。

正则表达式

'"\w+\":'

将匹配:

  • "双引号;
  • \w+一个或多个字(a-zA-Z0-9_)字符;
  • \"另一个双引号 - 注意:\字符不是必需的;然后
  • :冒号。

所以:

REGEXP_REPLACE(
  '{"key":"value","key2":"value with \"quote"}',
  '"\w+":',   -- Pattern matched
  ''          -- Replacement string
)

将输出:

{"value","value with \"quote"}

第二种模式{|}|"将匹配{}"字符(并且可能已被等效地写为[{}"])这样:

REGEXP_REPLACE(
  '{"value","value with \"quote"}',
  '{|}|"',    -- Pattern matched
  ''          -- Replacement string
)

将输出:

value,value with \quote

哪个好,直到(就像我的例子)你在值字符串中有一个转义双引号(或花括号);在这种情况下,那些也将被剥离,留下逃脱角色。

(注意:您通常不会找到此内容,但可以在密钥中包含转义引号。因此,{"keywith\":quote":"value"}会被{quote":"value"}替换为quote:value,然后REGEXP_REPLACE( '{"key":"value","key2":"value with \"quote","keywith\":quote":"value with \"{}"}', '^{|"(\\"|[^"])+":(")?((\\"|[^"])+?)\2((,)|})', '\3\6' ) 不是预期的输出。)

如果您正在尝试解析JSON(Oracle之前的版本12),那么您可以使用:

value,value with \"quote,value with \"{}

哪个输出:

SELECT *
FROM   JSON_TABLE(
         '{"key":"value","key2":"value with \"quote","keywith\":quote":"value with \"{}"}',
         '$.*' NULL ON ERROR
         COLUMNS (
           value VARCHAR2(4000) PATH '$'
         )
       )

或者在Oracle 12中,您可以这样做:

VALUE
-----------------
value
value with "quote
value with "{}

哪个输出:

    [
        {   "FirstName": "John", 
            "LastName": "Parker", 
            "Age": "23", 
            "Cat": "23g",
            "SOP": "Active"
        },
        {   "FirstName": "Rose", 
            "LastName": "Jackson", 
            "Age": "44", 
            "Cat": "44g",
            "SOP": "InActive"
        }
    ]

答案 1 :(得分:0)

example ::: REGEXP_REPLACE(string,pattern [,replacement_string [,start_position [,nth_appearance [,match_parameter]]]])

|是或者(可以多于一个替代),至少在{n,}至少n次

https://www.techonthenet.com/oracle/functions/regexp_replace.php "我收到了我的信息"

'" \ W + \":'为什么这些""使用的是' {|} |"','' 匹配一个单词字符(\ w)一次或多次(+)这必须搞砸它通过放置\"它错过了正确数量的近括号。 w + \" 他们允许"要显示。此表达式将一个表达式更改,然后将其用作下一个更改的基础。祝你好运。一旦你掌握了基础知识,正则表达式就不会太糟糕,非常直观。