如何在Oracle中解析字符串?

时间:2011-06-21 21:12:02

标签: sql oracle parsing string

如何在Oracle中的以下字符串中解析“request”的值?

<!-- accountId="123" activity="add" request="add user" -->

请求的大小和位置是随机的。

5 个答案:

答案 0 :(得分:6)

您可以使用正则表达式来查找:

regexp_replace(str, '.*request="([^"]*)".*', '\1')

答案 1 :(得分:4)

使用INSTR(givenstring, stringchartosearch,start_position)查找'request =“'的位置并找到结束'''的位置。

然后使用substr(string, starting_position, length)

答案 2 :(得分:1)

您使用instrsubstr

的组合

此示例仅用于示例目的。不要在生产代码中使用它,因为它不是很干净。

substr(my_str, 
       -- find request=" then get index of next char.
       instr(my_str, 'request="') + 9, 
       -- This is the second " after request. It does not allow for escapes
       instr(substr(my_str,instr(my_str, 'request="')), 2))

答案 3 :(得分:0)

以下是来自cwallenpoole和Craig的测试变体。对于正则表达式 - 请注意,如果“request =”不存在,则结果将是整个字符串。 user349433也部分存在,搜索中“request =”之前的空格也是如此:

SET serveroutput ON

DECLARE
  l_string             VARCHAR2(100) := '<!-- accountId="123" activity="add" request="add user" -->';
  l_result_from_substr VARCHAR2(50);
  l_result_from_regexp VARCHAR2(50);
BEGIN

  SELECT SUBSTR(l_string, instr(l_string, 'request="') + 9, instr(SUBSTR(l_string,instr(l_string, 'request="')), '"', 2)-1),
    regexp_replace(l_string, '.* request="([^"]*)".*', '\1')
  INTO l_result_from_substr,
    l_result_from_regexp
  FROM dual;

  dbms_output.put_line('Result from substr: '||l_result_from_substr);
  dbms_output.put_line('Result from regexp: '||l_result_from_regexp);

END;
/

答案 4 :(得分:0)

请注意等号&#34; =&#34;不一定必须在赋值中的请求变量之后立即到来。因此,搜索&#34; request =&#34;并不完全正确。您应该使用INSTR创建一个基本的有限状态机,首先找到&#34;请求&#34;,然后找到&#34; =&#34;,...