2017-08-01 24 views
0

我有一个字符串'MCDONALD_YYYYMMDD.TXT'我需要使用正则表达式并在给出的字符串中的字母'D'后附加'**'。 (即在位置9的字符串我需要附加'*'基于列值'star_len' 如果star_len = 2的o/p =''MCDONALD ?? _YYYYMMDD.TXT' 如果star_len = 1 O/p =“” MCDONALD?_YYYYMMDD.TXT”如何在下面给出的字符串上应用正则表达式

+0

再试一次。您的字符串是否总是包含句点和扩展名?在此期间之前,字符“下划线”后跟八位数字? (我认为它是数字而不是字母Y,M和D,对不对?)请不要与我们一起玩“猜我的要求”游戏。 – mathguy

+0

是的。在实时数据中,它将类似于MCDONALD_20170501.TXT,如果star_len = 1,那么o/p应该是= MCDONALD?_20170501.TXT –

+0

您从星号\ * \ *更改为问号? - 为什么? (也许堆栈溢出编辑器给你带来了麻烦......如果你没有看到星号,用一个反斜杠来转义它,如下所示:\\ * ...或者将所有内容都包含在后引号中以呈现为代码段。 ) – mathguy

回答

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

这是你如何能做到这一点。我不认为你需要它作为一个正则表达式但如果它总是将是‘麦当劳’ 。

编辑:如果您需要将提供字符串中的位置,以及,我觉得一个普通的旧子应该工作

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

这看起来相当不错,但是如果我有一个'position'= 9和'star_len'= 1的列,那么我的o/p ='MCDONALD?_123456.TXT'如何根据这个条件来编写 –

+0

@SanthoshPogaku - 做什么你的意思是“'position'= 9?你是在一个固定的位置追加,而不是在下划线和日期之前?你应该在原文中做得更清楚。如果这确实是你的要求,那么它比任何正则表达式的解决方案,但要确保原始问题是清楚的 – mathguy

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

宾果!现在完善它的作品。我会他狡猾地谢谢你的时间:) –

+0

@SanthoshPogaku - 如果问题得到解答,您应该选择一个正确的答案(也许承认其他有用的答案也upvoting)。 – mathguy

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

如果你正在使用'REGEXP_REPLACE()',你不需要匹配模式中的'(。*)$'位 - 只需从替换字符串中删除它并且还可以使用'||'\ 2''。像这样:'select regexp_replace(filename,'^(。{'||(position-1)||'})','\ 1'|| rpad('*',star_len,'*'))as fixed ' – mathguy

相关问题