REGEXP_REPLACE
function replaces string with regular expression matching supports. The simplest format for this function is:
REGEXP_REPLACE (source_string, pattern_to_find, pattern_to_replace_by)
The general format for the REGEXP_REPLACE
function with all the options is
REGEXP_REPLACE (source_string,
pattern_to_find,
[pattern_to_replace_by,
position,
occurrence,
match_parameter])
- source_string:the string you want to search for
- pattern-to-find:the pattern used to search.
- pattern_to_replace_by: pattern used to do the matching
- position:indicates where to start.
- occurrence:indicates which occurrence of the pattern-to-find in the source-string you want to search for. For example, which occurrence of "si" do you want to extract from the source string "Mississippi".
- match-parameter:for further customizing.
- "i" in match-parameter can be used for caseinsensitive matching
- "c" in match-parameter can be used for casesensitive matching
- "n" in match-parameter allows the period to match the new line character
- "m" in match-parameter allows for more than one line in source-string
Example:
SQL> SELECT REGEXP_REPLACE('Mississippi', 'si', 'SI', 1, 0, 'i') FROM dual;
REGEXP_REPL
-----------
MisSIsSIppi
SQL> SELECT REGEXP_REPLACE('lord, llll','l[[:alpha:]]{2}', 'ssss') AS result FROM dual;
RESULT
------------
ssssd, ssssl
SQL Query to remove Non-Numeric characters from a String
Using TRANSLATE and REPLACE Function
We can use this method when we are completely aware of what all non-numeric characters that would be present in the input value. Here in this example i am trying to remove non-numeric characters from phone number field
SELECT TRANSLATE(REPLACE(LOWER('Ph +91 984-809-8540'),'(0) -',' '),'abcdefghijklmnopqrstuvwxyz()- +/,.#',' ') OUT_PUT FROM dual;
rs from phone number field
SELECT TRANSLATE(REPLACE(LOWER('Ph +91 984-809-8540'),'(0) -',' '),'abcdefghijklmnopqrstuvwxyz()- +/,.#',' ') OUT_PUT FROM dual;
|
The above query would return a output as “919848098540” but if the input is something like ‘Ph: +91 984-809-8540‘ then this would return an output ‘:919848098540‘ since we are not handling the character ‘:‘. So we can’t go for this method if we are not sure of the all possible non-numeric characters that would come in as input.
Using Regular Expression:
regexp_replace function replaces string with regular expression matching supports. The simplest format for this function is:
REGEXP_REPLACE (source_string, pattern_to_find, pattern_to_replace_by)
SELECT to_number(regexp_replace('Ph: +91 984-809-8540', '[^0-9]+', '')) OUT_PUT FROM dual;
|
The above statement would replace all the characters except the digits 0-9 with null.
SELECT to_number(regexp_replace('Ph: +91 984-809-8540', '\D', '')) OUT_PUT FROM dual;
|
In this statement ‘\D’ would find all Non-digit characters and the will be replaced by null.
Though the above two statements works well, there is a scenario where these two statements fail to work, let me tell you with an example
SELECT to_number(regexp_replace('0*0-7-', '[^0-9]+', '')) OUT_PUT FROM dual;
SELECT to_number(regexp_replace('0*0-7-', '\D', '')) OUT_PUT FROM dual;
|
we expect the above statement to return ‘007’ instead they would return ‘7’. this method omitts if we have digit ‘0’ as prefix.
The best method I found is to use regexp Metacharacter ‘:digit:‘ which matches digits 0-9
SELECT REGEXP_REPLACE( '0*0-7-', '[^[:digit:]]', NULL ) OUT_PUT FROM DUAL;
|
SELECT regexp_replace( 'Ph: +91 984-809-8540', '[^[:digit:]]', NULL ) FROM dual;
|
No comments:
Post a Comment