String 使用REGEXP\u SUBSTR获取键值对数据

String 使用REGEXP\u SUBSTR获取键值对数据,string,oracle,oracle12c,String,Oracle,Oracle12c,我有一列包含以下值 User_Id=446^User_Input=L307-60#/25" AP^^ 我试图根据指定的键获取每个单独的值 User_Id=之后的所有值,直到遇到^ 用户输入后的所有值=直到遇到^ 我试过了,到目前为止我有这个 SELECT LTRIM(REGEXP_SUBSTR('User_Id=446^User_Input=L307-60#/25" AP^' ,'[0-9]+',1,1),'^') User_Id from dual 如何获取用户输入

我有一列包含以下值

User_Id=446^User_Input=L307-60#/25" AP^^
我试图根据指定的键获取每个单独的值

  • User_Id=之后的所有值,直到遇到^
  • 用户输入后的所有值=直到遇到^
  • 我试过了,到目前为止我有这个

    SELECT  LTRIM(REGEXP_SUBSTR('User_Id=446^User_Input=L307-60#/25" AP^'
              ,'[0-9]+',1,1),'^') User_Id 
    from dual
    
    如何获取用户输入的值

    s:用户输入可以有任何东西,比如“,”,*,%,包括在字符串中间的<代码> ^ <代码>(即,不是定界符)。


    任何帮助都将不胜感激。

    如果没有特别需要使用Regex,类似这样的东西将返回值

    WITH rslt AS (
    SELECT 'User_Id=446^User_Input=L307-60#/25" AP^' val 
      FROM dual
    )
    SELECT LTRIM(SUBSTR(val
                       ,INSTR(val, '=', 1, 2) + 1
                       ,INSTR(val, '^', 1, 2) - (INSTR(val, '=', 1, 2) + 1)))
      FROM rslt;
    

    当然,如果不能保证不会有任何有效文本字符的插入符号,这可能会返回部分结果。

    假设字符串中始终包含“User\u Id=”和“User\u Input=”,我将使用字符组方法进行解析

    使用起始锚点
    ^
    和结束锚点
    $
    。查找
    'User\u Id='
    'User\u Input='

    将要搜索的值与字符组关联

        SCOTT@dev> 
      1  SELECT REGEXP_SUBSTR('User_Id=446^User_Input=L307-60#/25" AP^','^User_Id=(.*\^)User_Input=(.*\^)$',1, 1, NULL, 1) User_Id
      2* FROM dual
    SCOTT@dev> /
    
    USER
    ====
    446^
    
    
    SCOTT@dev> 
      1  SELECT REGEXP_SUBSTR('User_Id=446^User_Input=L307-60#/25" AP^','^User_Id=(.*\^)User_Input=(.*\^)$',1, 1, NULL, 2) User_Input
      2* FROM dual
    SCOTT@dev> /
    
    USER_INPUT
    ================
    L307-60#/25" AP^
    
    SCOTT@dev> 
    

    这可以很容易地解决,使用boring old来计算键和值字符串的起点和终点的偏移量

    诀窍是使用可选的引用参数来标识每个
    =
    的正确实例。因为输入可以包含不作为分隔符的插入符号,所以我们需要使用负位置来标识最后一个
    ^

    with cte as  (
      select kv
             , instr(kv, '=', 1, 1)+1 as k_st  -- first occurrence 
             , instr(kv, '^', 1) as k_end
             , instr(kv, '=', 1, 2)+1 as v_st  -- second occurrence 
             , instr(kv, '^', -1) as v_end     -- counting from back
      from t23
      )
    select substr(kv, k_st, k_end - k_st) as user_id
           , substr(kv, v_st, v_end - v_st) as user_input
    from cte
    /
    

    这是答案。我认为它比任何regex等价物都更容易理解。

    从我的一个朋友那里得到了这个答案。。看起来简单,效果很好

    SELECT
    regexp_replace('User_Id=446^User_Input=L307-60#/25" AP^^', '.*User_Id=([^\^]+).*', '\1') User_Id,
    regexp_replace('User_Id=446^User_Input=L307-60#/25" AP^^', '.*User_Input=(.*)[\^]$', '\1') User_Input
    FROM dual
    

    如果“用户输入有任何内容,请在此处发布,以防您感兴趣。

    “您确定它不能有^吗?如果可以有插入符号,如何区分作为数据一部分的插入符号和作为分隔符的插入符号?是否有理由需要使用正则表达式而不是
    INSTR
    SUBSTR
    ?没错,用户输入可以有^,应用程序中没有阻止他们输入的停止。我只是在尝试正则表达式的方法,如果你能建议一种使用INSTR和SUBSTR的方法,那也太好了。这种字符串看起来像xml文档元素中的一组修改过的属性。如果您正在解析xml,使用Oracle的xml解析功能是有价值的。如果您有字符串“User\u Id=446^ User\u Input=L^307-^60^/25”AP,您希望返回什么^"? 是否要修改发布的算法,使其在找到第一个插入符号并忽略最后一个插入符号读取到字符串末尾时不会停止?如果我们实现您指定的算法,我们只会返回“L”。在
    User\u输入之后可能会有其他键/值对吗?
    ?我刚刚就这个主题写了一个答案-它会在给定字符串中获取所有
    name=value
    对:是的,这也会从字符串中过滤掉“^”。谢谢你的尝试!!