如何識別字串中含有連續字元的處理辦法

dbasdk發表於2014-09-02
      題目寫的有點繞,實際的意思是,如何在一個給定的字串中,識別出有連續的如英文字元或數字,且這些英文字元或數字也是連續的(2個或2個以上)。
即,如12、123、abc、abcd這樣的情況。
      一開始遇到這個問題,我的思路是以類似連續號段的這種處理方式來解決,但是兩者的不同之處在於,一個是字串本身的判斷,一個是字串與字串之間的判斷。兩者是不同的。
      那思路又轉為,可以將字串本身拆成多行,然後判斷這些行之間的連續性。這樣處理未嘗不可,曾經也幹過這事,不過有個缺點就是,中間結果集會以幾倍的方式增長,處理的效能也會降低。
      於是,就考慮是否可以在字串內部解決。後面的解決的辦法告訴我,如果還是用老的方法去套,你是會繞進去的,最終也找不到解決辦法。於是我換了個角度,考慮到連續的字串,其實其組合是有限的,所以可以將這些字串拼接出來,然後再到原始字串去查詢即可。那連續的字串如何生成呢?
      程式碼如下:

點選(此處)摺疊或開啟

  1. select replace(sys_connect_by_path(c, \',\'), \',\') ss
  2.   from (select rownum i, chr(65 + rownum - 1) c
  3.           from dual
  4.         connect by rownum <= 26)
  5.  connect by prior i = i - 1
以上實現字串的所有順序組合情況。

下面實現對連續字串的篩選(2個及以上):

點選(此處)摺疊或開啟

  1. select ss
  2. from (select replace(sys_connect_by_path(c, \',\'), \',\') ss
  3.         from (select rownum i, chr(65 + rownum - 1) c
  4.                 from dual
  5.               connect by rownum <= 26)
  6.        connect by prior i = i - 1)
  7.  where length(ss) >= 2


然後,使用正規表示式取出其中連續的英文字元:

點選(此處)摺疊或開啟

  1. select teststr,
  2.        regexp_substr(upper(teststr), \'[A-Z]{2,10}\') reqstr
  3.   from test
  4.  where regexp_substr(upper(teststr), \'[A-Z]{2,10}\') in
  5.        (select ss
  6.           from (select replace(sys_connect_by_path(c, \',\'), \',\') ss
  7.                   from (select rownum i, chr(65 + rownum - 1) c
  8.                           from dual
  9.                         connect by rownum <= 26)
  10.                 connect by prior i = i - 1)
  11.          where length(ss) >= 2)
完成。

如果是數字,那麼應用的情況可能會有兩種:
第一種是從類似手機號碼這樣的字串中找出存在連續數字的(這種是從純數字中取)。
第二種是從字串中,找出存在連續數字的(這種字串是多種字元的組合,除數字外也可能含有英文及中文字元等,只是要取其中連續部分的數字來判斷)
第二種比較簡單,跟前面介紹的方法類似。第一種的話,可能不僅連續數字需要查,而且還有相同數字的需求,所以,可以這樣實現:

點選(此處)摺疊或開啟

  1. with
  2. tmp1 as(select rownum - 1 r from dual connect by rownum <= 10),
  3. tmp2 as(select lpad(a.r, b.r, a.r) rr from tmp1 a, tmp1 b),
  4. tmp3 as(
  5. select rr from tmp2 where length(rr)>4
  6. union all
  7. select ss from (
  8. select replace(sys_connect_by_path(n, \',\'), \',\') ss
  9.   from (select rownum i, to_char(rownum-1) n
  10.           from dual
  11.         connect by rownum <= 10)
  12. connect by prior i = i - 1)
  13. where length(ss) >= 4)
  14. select c_mobileno from taccoinfo a, tmp3 b where instr(a.c_mobileno, b.rr) > 0
其作用是,找出存在至少四個數字是連續的,或相同的數字型的字串。




來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29734436/viewspace-1262023/,如需轉載,請註明出處,否則將追究法律責任。

相關文章