Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

REGEXP_SUBSTR question

John O'TooleFeb 25 2009 — edited Sep 14 2010
Folks, I'm trying to use REGEXP_SUBSTR to find the piece of text between the second last and last occurrence of a backslash. I can find the text between any specified occurrences of backslashes when I start at the front, but I don't know how many backslashes there will be in the string.
I'm on 10g R2, so don't have access to REGEXP_COUNT.
WITH test_data AS (
SELECT 'c:\temp\folderA\fileA.txt' t FROM DUAL UNION ALL
SELECT 'c:\temp\fileA.txt' t FROM DUAL UNION ALL
SELECT '\\mymachine\A\fileB.txt' t FROM DUAL UNION ALL
SELECT '\\mymachine\A\B\fileB.txt' t FROM DUAL UNION ALL
SELECT '\\mymachine\A\B\C\image.jpg' t FROM DUAL UNION ALL
SELECT '\\mymachine\A\B\C\D\music.mpg' t FROM DUAL UNION ALL
SELECT 'c:\myfolder\folderD\folderE\4969-A.txt' t FROM DUAL
)
SELECT t, REGEXP_SUBSTR(t,'[^\]+', 1, 3) my_string
FROM test_data;
The REGEXP_SUBSTR in that example gives me the third occurrence, which isn't quite right. The output I would like is:
folderA
temp
A
B
C
D
folderE
Many Thanks.
This post has been answered by Karthick2003 on Feb 25 2009
Jump to Answer

Comments

Karthick2003
Answer
Without regexp
SQL> WITH test_data AS (
  2  SELECT 'c:\temp\folderA\fileA.txt' t FROM DUAL UNION ALL
  3  SELECT 'c:\temp\fileA.txt' t FROM DUAL UNION ALL
  4  SELECT '\\mymachine\A\fileB.txt' t FROM DUAL UNION ALL
  5  SELECT '\\mymachine\A\B\fileB.txt' t FROM DUAL UNION ALL
  6  SELECT '\\mymachine\A\B\C\image.jpg' t FROM DUAL UNION ALL
  7  SELECT '\\mymachine\A\B\C\D\music.mpg' t FROM DUAL UNION ALL
  8  SELECT 'c:\myfolder\folderD\folderE\4969-A.txt' t FROM DUAL
  9  )
 10  SELECT t, substr(t, instr(t,'\',-1,2)+1, (instr(t,'\',-1,1)-instr(t,'\',-1,2))-1) my_string
 11  FROM test_data;

T                                      MY_STRING
-------------------------------------- --------------------------------------
c:\temp\folderA\fileA.txt              folderA
c:\temp\fileA.txt                      temp
\\mymachine\A\fileB.txt                A
\\mymachine\A\B\fileB.txt              B
\\mymachine\A\B\C\image.jpg            C
\\mymachine\A\B\C\D\music.mpg          D
c:\myfolder\folderD\folderE\4969-A.txt folderE
Marked as Answer by John O'Toole · Sep 27 2020
BluShadow
Easier to use REGEXP_REPLACE to remove everything you don't want...
SQL> ed
Wrote file afiedt.buf

  1  WITH test_data AS (
  2  SELECT 'c:\temp\folderA\fileA.txt' t FROM DUAL UNION ALL
  3  SELECT 'c:\temp\fileA.txt' t FROM DUAL UNION ALL
  4  SELECT '\\mymachine\A\fileB.txt' t FROM DUAL UNION ALL
  5  SELECT '\\mymachine\A\B\fileB.txt' t FROM DUAL UNION ALL
  6  SELECT '\\mymachine\A\B\C\image.jpg' t FROM DUAL UNION ALL
  7  SELECT '\\mymachine\A\B\C\D\music.mpg' t FROM DUAL UNION ALL
  8  SELECT 'c:\myfolder\folderD\folderE\4969-A.txt' t FROM DUAL
  9  )
 10  select regexp_replace(t, '^.*[\]([^\]*)[\][^\]*$','\1')
 11* from test_data
SQL> /

REGEXP_REPLACE(T,'^.*[\]([^\]*)[\][^\]*$','\1')
------------------------------------------------------------------
folderA
temp
A
B
C
D
folderE

7 rows selected.

SQL>
John O'Toole
Perfect. With all this REGEXP lark around, its sometimes easy to forget about the old skool string functions.
Thanks
Aketi Jyuuzou
col str for a20

WITH test_data AS (
SELECT 'c:\temp\folderA\fileA.txt' t FROM DUAL UNION ALL
SELECT 'c:\temp\fileA.txt' t FROM DUAL UNION ALL
SELECT '\\mymachine\A\fileB.txt' t FROM DUAL UNION ALL
SELECT '\\mymachine\A\B\fileB.txt' t FROM DUAL UNION ALL
SELECT '\\mymachine\A\B\C\image.jpg' t FROM DUAL UNION ALL
SELECT '\\mymachine\A\B\C\D\music.mpg' t FROM DUAL UNION ALL
SELECT 'c:\myfolder\folderD\folderE\4969-A.txt' t FROM DUAL)
select t,RegExp_replace(t,'^.*?([^\]+)\\[^\]+$','\1') as str
  from test_data
order by t;

T                                       STR
--------------------------------------  -------
\\mymachine\A\B\C\D\music.mpg           D
\\mymachine\A\B\C\image.jpg             C
\\mymachine\A\B\fileB.txt               B
\\mymachine\A\fileB.txt                 A
c:\myfolder\folderD\folderE\4969-A.txt  folderE
c:\temp\fileA.txt                       temp
c:\temp\folderA\fileA.txt               folderA
And I used regexp_count B-)
select t,RegExp_substr(t,'[^\]+',1,-1+regexp_count(t,'[^\]+')) as str
  from test_data
order by t;
LostWorld
How do you people learn all this? where from you get these requirements and how do you find out which all functions you can apply at what scenario? Most of these oracle fucntions we don't use normally.


Amzing i must say :)
Kanish
It is really amazing, Could you explain me step by step.

kanish
1 - 6
Locked Post
New comments cannot be posted to this locked post.

Post Details

Locked on Oct 12 2010
Added on Feb 25 2009
6 comments
6,759 views