oracle正则表达式问题。有个字符串abca4gf,我想匹配a开头,f结尾的字符串, 我想要的结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle正则表达式问题。有个字符串abca4gf,我想匹配a开头,f结尾的字符串, 我想要的结相关的知识,希望对你有一定的参考价值。

oracle正则表达式问题。有个字符串abca4gf,我想匹配a开头,f结尾的字符串, 我想要的结果是a4gf而不是abca4gf,这个应该怎么写? 我用regexp_substr('abca4gf','a.+?f') 这样不行

参考技术A 你的条件是a开头f结尾,结果你这两个字符串都可以满足,这样肯定不行。
如果你的字符串都是固定长度的,你可以尝试用长度来限制看看。
参考技术B --建表
CREATE table temp_01 (str_out VARCHAR2(10));
CREATE table temp_02 (str_out VARCHAR2(10));
--取字段
declare
-- Local variables here
i integer;
begin
-- Test statements here
for i in 1 .. 2 loop
INSERT INTO temp_01
SELECT regexp_substr('abca4gf','[^a]+',i,i) str_out
FROM dual;
COMMIT;
end loop ;
INSERT INTO temp_02
SELECT 'a'||str_out FROM temp_01 WHERE str_out LIKE '%f';
COMMIT;
end;

--查询结果
SELECT * FROM temp_02
参考技术C 我不知道正则表达式是个什么概念
但是这样可以得到你想要的a4gf
SELECT substr('abca4gf',1,1)||substr('abca4gf',5,3) FROM dual;
你不是说要匹配a和f吗 那要4g是干什么啊

Oracle - 用正则表达式列表替换记录的子字符串

【中文标题】Oracle - 用正则表达式列表替换记录的子字符串【英文标题】:Oracle - Substitute substrings of records by a list of regular expressions 【发布时间】:2015-02-26 13:49:53 【问题描述】:

我想清理一个字母数字 (varchar2) 记录表。应检查每条记录是否包含一组脏字,以防万一。模式和替换存储在单独的表中。

示例:

create table to_clean (
text_id number,
dirty_text  varchar2(4000));

insert into to_clean values(1,'hello this is my dirtyword1 text.');
insert into to_clean values(2,'hello this is my dirtyword3 text.');
insert into to_clean values(3,'hello this is my dirtyword2 dirtyword1  text.');

create table regex_list(
pattern varchar2(400),
replacement varchar2(400));

insert into regex_list values('dirtyword1','clean1');
insert into regex_list values('dirtyword2',' '); --remove totally
insert into regex_list values('dirtyword3','clean3');

伪代码:

for each dirty_text in to_clean
    for pattern, replacement in regexlist
        regex_replace(dirty_text, pattern, replacement)

在 Oracle 中解决此问题的最有效方法是什么? regex_list 包含正则表达式和纯字符串作为模式。我只想替换完整的单词,而不是部分单词(所以用空格分隔)

【问题讨论】:

原来的表要保持不变,所以只有select才需要替换。 regex_list 表中真的有正则表达式吗?还是只是要替换的字符串?要替换部分单词吗?如果您的to_clean 表有一个字符串“Somedirtyword1InTheMiddle”,您想替换它吗?还是只想替换完整的单词? regex_list 包含正则表达式和平面字符串作为模式。我只想替换完整的单词,不替换部分单词(因此由以下空格分隔) 我假设你的dirty_text 值可能包含多个脏字,例如'hello this is my dirtyword1 and dirtyword2 text.',对吗? 是的,这可能发生。 【参考方案1】:

试试这个:

UPDATE to_clean c
   SET dirty_text =
          (SELECT REGEXP_REPLACE (dirty_text, pattern, replacement) replaced
             FROM    regex_list r
                  INNER JOIN
                     (SELECT t.*,
                             (SELECT pattern
                                FROM regex_list
                               WHERE INSTR (T.DIRTY_TEXT, pattern) <> 0)
                                find_pat
                        FROM to_clean t) s
                  ON (r.pattern = s.find_pat)
            WHERE c.dirty_text = dirty_text);

如果你有表达式,而不是单词,instr 不起作用,那么使用 regexp_like(正如 Justin Cave 所说):

SELECT REGEXP_REPLACE (dirty_text, pattern, replacement) replaced
             FROM    regex_list r
                  INNER JOIN
                     (SELECT t.*,
                             (SELECT pattern
                                FROM regex_list
                               WHERE regexp_like(T.DIRTY_TEXT,pattern) )
                                find_pat
                        FROM to_clean t) s
                  ON (r.pattern = s.find_pat) 

编辑

在这种情况下,您可以使用 plsql。请看这个:

--Create oracle objects
create or replace type clean_o as object(text_id number,dirty_text varchar2(500));
create or replace type clean_t as table of clean_o; 

--Function
create or replace function clean_text return clean_t pipelined is 
    cursor clean_c is select * from to_clean;
    text varchar2(250);
begin
    for c in clean_c loop
       text:= c.dirty_text; 
       for i in (select * from regex_list) loop
          text:= regexp_replace(text,i.pattern,i.replacement);  
       end loop;
       PIPE ROW (clean_o(c.text_id,text));
    end loop;
end;

现在你可以这样做了:

select * from table(clean_text)

【讨论】:

请注意,这将替换部分单词(即“Somedirtyword1InTheMiddle”中的dirtyWord1)而不是整个单词。instr 需要替换为regexp_like 以处理pattern. 你可能希望regex_list 表中的“纯字符串”是实现“整个单词”逻辑的正则表达式(即字符串的开头或前导空白字符,尾随白色空格或标点字符或字符串的结尾)。 是的@JustinCave,你是对的,但在这种情况下,他想删除单词而不是表达式,所以 instr 可以完美地查找单词,否则我会同意你的。谢谢 INSTR() 可以替换为 REGEXP_INSTR(),但在这种情况下,我认为这不会比 REGEXP_LIKE() 有任何好处。 伙计,你是个强迫症患者,不是吗?感谢您的努力,明天将测试它。 GGG,我希望那个人,我只是另一个喜欢甲骨文的男孩。我非常感谢您的评论,并希望这会有所帮助。:)

以上是关于oracle正则表达式问题。有个字符串abca4gf,我想匹配a开头,f结尾的字符串, 我想要的结的主要内容,如果未能解决你的问题,请参考以下文章

Oracle正则表达式

2015.3.20 Oracle使用正则表达式

oracle 正则表达的使用

Oracle 正则表达式

oracle 正则表达式?=

Oracle正则表达式在特殊字符后显示字符串