auto 发表于 2013-2-22 23:26:36

请教该正则应如何写?空格\tab\换行\回车替换成一个空格

本帖最后由 auto 于 2013-2-23 09:25 编辑

请教该正则应如何写?空格\tab\换行\回车替换也一个空格,单个'号变成两个单引号''
一对单引号内容则完整保留。多行转成一行。其他的不变
例如: select a.*, 'a      b' as aa
          from          dual a
          where 1=1;
结果: select a.*, 'a      b' as aa from dual a where 1=1;


下面是是复杂一些的测试数据。
SELECT c.cd_name AS "街乡名称", r.rs AS "人数"
FROM (
        SELECT *
        FROM cdg_regioncode
        WHERE cd_id LIKE '110105___000'
                AND cd_id <> '110105000000'
                AND cd_availability = '1'
) c
        LEFT JOIN (
                SELECT substr(r.rzf_xzdxzqh, 1, 9) || '000' AS xzqh, COUNT(1) AS rs
                FROM sjcj_rydjbxx r, sjcj_fwdjbxx f
                WHERE f.bih_id = r.rzf_fwbh
                        AND f.fdj_sfzc = '0'
                        AND f.fwzjbxxdjb_fwzbh IS NOT NULL
                        AND f.bih_hou_constructiontype = '3'
                        AND f.fcz_czlx = '08'
                        AND r.rdj_sfzc = '0'
                        AND r.fwzjbxxdjb_fwzbh IS NOT NULL
                        AND r.rdj_sfyx = '1'
                        AND r.rzf_zslx = '02'
                        AND r.rzf_xzdxzqh LIKE '110105%'
                GROUP BY substr(r.rzf_xzdxzqh, 1, 9)
        ) r ON c.cd_id = r.xzqh
ORDER BY c.cd_id

lxwlxwayy 发表于 2013-2-22 23:52:28

正则太深了,头晕

afan 发表于 2013-2-23 10:57:33

Local $Str = _
                "select a.*, 'a      b' as aa " & @CRLF & _
                '          from          dual a' & @CRLF & _
                '          where 1=1;' & @CRLF
;MsgBox(0, '原字符串', $Str)
Local $Test = StringRegExpReplace($str, "((').*?\2)|\v*?(\h)\s+", '$1$3')
MsgBox(0, '替换结果', $Test)

jiushizhu 发表于 2013-2-24 13:24:50

我现在还没弄明白正则表达式是什么意思呢

auto 发表于 2013-3-3 22:09:44

本帖最后由 auto 于 2013-3-3 22:10 编辑

回复 3# afan


    试了这个另外一个代码,好像没有效果

能把正则的写法稍微解释一吗?谢谢

with t as(select '34052419800101001X'id from dual)
select id
from t
where exists(select 1
from dual connect by level<=length(id)-1 --17
having mod(sum(substr(id,level,1)*power(2,18-level)),11)=
case substr(id,-1,1)
when '1' then 0
when '0' then 1
when 'X' then 2
else
12-substr(id,-1,1)
end);

afan 发表于 2013-3-3 22:27:19

回复 6# auto


    你一直也没说要整成什么结果…
难道你想整个这段整成一行?with t as(select '34052419800101001X' id from dual) select id from t where exists(select 1 from dual connect by level<=length(id)-1 --17 having mod(sum(substr(id,level,1)*power(2,18-level)),11)= case substr(id,-1,1) when '1'then 0 when '0'then 1 when 'X'then 2 else 12-substr(id,-1,1) end);

auto 发表于 2013-3-3 22:35:54

回复 7# afan


空格\tab 替换成一个空格,
单个'号变成两个单引号''
一对单(双)引号内容则完整保留(不管里面是什么)。
换行\回车 替换成空格,即多行转成一行(这个可要也可以不要)
其他的不变

增加一个要求,不知道是否能实现
--后的字符,至行结束,删除
(例如: and id!='123' --过滤ID不等于123的数据
             and xh > 1000
    转换成: and id!='123' and and xh > 1000

afan 发表于 2013-3-3 22:49:20

回复afan
空格\tab 替换成一个空格,
单个'号变成两个单引号''
...
auto 发表于 2013-3-3 22:35 http://www.autoitx.com/images/common/back.gif


    1,你不用贴代码的方式贴字符串已不存在 \tab
2,单个'号变成两个单引号'' 示例没有体现,不知道何种情况是属于单个
3,转换成: and id!='123' and and xh > 1000 不知道为何会有两个 and...

搞不定~

auto 发表于 2013-3-3 23:19:57

回复 9# afan


    1、对于1的情况,没有想到,我一会试一下贴成代码
    2、我找一个完整的转换的例子吧
   3、是笔误。。打的时候,多了一个and


另:正则的注册申请码是D54E759F539DF22F196AC5118C3A0Eauto以前的不见了,给个注册码

afan 发表于 2013-3-3 23:21:58

回复 10# auto BC3E9348872A3CEEA46D6B60E9B2A21498F1194EFD45
页: [1]
查看完整版本: 请教该正则应如何写?空格\tab\换行\回车替换成一个空格