2011-06-21 96 views
4

如何解析Oracle中以下字符串中「request」的值?如何解析Oracle中的字符串?

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

尺寸和請求的位置是隨機的。

+1

事實上,你已經以XML註釋的形式將字符串括在尖括號中,這讓我問如果它是XML,你正在處理?下面的答案適用於純字符串,並且適用於XML,但如果它是XML,則使用XMLTYPE可能更健壯。 –

回答

6

您可以使用正則表達式來找到這個:

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

您可能需要考慮使用'。* \ s + request'開始正則表達式,以便它不匹配'subrequest =「foo」'之類的東西。 – Josh

4

使用INSTR(givenstring, stringchartosearch,start_position)查找'request =''的位置並查找'''的結束位置。

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

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)) 
0

下面是cwallenpoole和克雷格·我的測試變化。對於正則表達式 - 請注意,如果「request =」不存在,則結果將是整個字符串。 user349433部分是那裏,有一個空格「請求=」,在搜索效果一樣好:

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; 
/
0

請注意等號「=」並不一定要在分配請求變量之後馬上就。因此,搜索「request =」並不完全正確。你應該使用INSTR創建一個基本的有限狀態機,首先找到「請求」,然後找到「=」,...