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