如何在下面给定的字符串上应用正则表达式

时间:2017-08-01 19:07:16

标签: oracle regexp-substr

我有一个字符串' MCDONALD_YYYYMMDD.TXT'我需要使用正则表达式并附加' **'在这封信之后' D'在给出的字符串中。 (即在位置9的字符串中,我需要根据列值' star_len'附加' *' 如果star_len = 2则o / p =' MCDONALD ?? _ YYYYMMDD.TXT' 如果star_len = 1则o / p =' MCDONALD?_YYYYMMDD.TXT'

3 个答案:

答案 0 :(得分:1)

with
     inputs ( filename, position, symbol, len ) as ( 
       select 'MCDONALD_20170812.TXT', 9, '*', 2 from dual
     )
-- End of simulated inputs (for testing purposes only, not part of the solution).
-- SQL query begins BELOW THIS LINE.
select substr(filename, 1, position - 1) || rpad(symbol, len, symbol) 
                                         || substr(filename, position) as new_str
from   inputs
;

NEW_STR
-----------------------
MCDONALD**_20170812.TXT

答案 1 :(得分:0)

select regexp_replace('MCDONALD_YYYYMMDD.TXT','MCDONALD','MCDONALD' || 
          decode(star_len,1,'*',2,'**'))
from dual

这就是你如何做到的。我不认为你需要它作为一个正则表达式,尽管它总是会成为“MCDONALD”。

编辑:如果你需要在字符串中提供位置,我认为常规的旧子字符串应该可以工作。

select substr('MCDONALD_YYYYMMDD.TXT',1,position-1) || 
          decode(star_len,1,'*',2,'**') || substr('MCDONALD_YYYYMMDD.TXT',position) 
from dual

其中position和star_len都是您提供的某个表中的列(而不是双列)。

EDIT2:为了更清楚,这是另一个使用with子句的示例,以便在不添加表的情况下运行。

    with testing as
(select 'MCDONALD_YYYYMMDD.TXT' filename,
        9 positionnum,
        2 star_len
from dual)

select substr(filename,1,positionnum-1) || 
            decode(star_len,1,'*',2,'**') || 
            substr(filename,positionnum)
from testing

答案 2 :(得分:0)

为了它的乐趣,这里是一个regex_replace解决方案。我和一个明星一起去了,因为即使你的例子使用了问号,你的变量也会被调用。正则表达式分两部分捕获文件名字符串,第一部分是从开始到位置值前的1个字符,第二个是字符串的其余部分。替换将捕获的部分与之间的星星重新组合在一起。

with tbl(filename, position, star_len ) as ( 
       select 'MCDONALD_20170812.TXT', 9, 2 from dual
)
select regexp_replace(filename, 
       '^(.{'||(position-1)||'})(.*)$', '\1'||rpad('*', star_len, '*')||'\2') as fixed
from tbl;