如何識別字串中含有連續字元的處理辦法
題目寫的有點繞,實際的意思是,如何在一個給定的字串中,識別出有連續的如英文字元或數字,且這些英文字元或數字也是連續的(2個或2個以上)。
即,如12、123、abc、abcd這樣的情況。
一開始遇到這個問題,我的思路是以類似連續號段的這種處理方式來解決,但是兩者的不同之處在於,一個是字串本身的判斷,一個是字串與字串之間的判斷。兩者是不同的。
那思路又轉為,可以將字串本身拆成多行,然後判斷這些行之間的連續性。這樣處理未嘗不可,曾經也幹過這事,不過有個缺點就是,中間結果集會以幾倍的方式增長,處理的效能也會降低。
於是,就考慮是否可以在字串內部解決。後面的解決的辦法告訴我,如果還是用老的方法去套,你是會繞進去的,最終也找不到解決辦法。於是我換了個角度,考慮到連續的字串,其實其組合是有限的,所以可以將這些字串拼接出來,然後再到原始字串去查詢即可。那連續的字串如何生成呢?
程式碼如下:
以上實現字串的所有順序組合情況。
下面實現對連續字串的篩選(2個及以上):
然後,使用正規表示式取出其中連續的英文字元:
完成。
如果是數字,那麼應用的情況可能會有兩種:
第一種是從類似手機號碼這樣的字串中找出存在連續數字的(這種是從純數字中取)。
第二種是從字串中,找出存在連續數字的(這種字串是多種字元的組合,除數字外也可能含有英文及中文字元等,只是要取其中連續部分的數字來判斷)
第二種比較簡單,跟前面介紹的方法類似。第一種的話,可能不僅連續數字需要查,而且還有相同數字的需求,所以,可以這樣實現:
其作用是,找出存在至少四個數字是連續的,或相同的數字型的字串。
即,如12、123、abc、abcd這樣的情況。
一開始遇到這個問題,我的思路是以類似連續號段的這種處理方式來解決,但是兩者的不同之處在於,一個是字串本身的判斷,一個是字串與字串之間的判斷。兩者是不同的。
那思路又轉為,可以將字串本身拆成多行,然後判斷這些行之間的連續性。這樣處理未嘗不可,曾經也幹過這事,不過有個缺點就是,中間結果集會以幾倍的方式增長,處理的效能也會降低。
於是,就考慮是否可以在字串內部解決。後面的解決的辦法告訴我,如果還是用老的方法去套,你是會繞進去的,最終也找不到解決辦法。於是我換了個角度,考慮到連續的字串,其實其組合是有限的,所以可以將這些字串拼接出來,然後再到原始字串去查詢即可。那連續的字串如何生成呢?
程式碼如下:
點選(此處)摺疊或開啟
-
select replace(sys_connect_by_path(c, \',\'), \',\') ss
-
from (select rownum i, chr(65 + rownum - 1) c
-
from dual
-
connect by rownum <= 26)
- connect by prior i = i - 1
下面實現對連續字串的篩選(2個及以上):
點選(此處)摺疊或開啟
-
select ss
-
from (select replace(sys_connect_by_path(c, \',\'), \',\') ss
-
from (select rownum i, chr(65 + rownum - 1) c
-
from dual
-
connect by rownum <= 26)
-
connect by prior i = i - 1)
- where length(ss) >= 2
然後,使用正規表示式取出其中連續的英文字元:
點選(此處)摺疊或開啟
-
select teststr,
-
regexp_substr(upper(teststr), \'[A-Z]{2,10}\') reqstr
-
from test
-
where regexp_substr(upper(teststr), \'[A-Z]{2,10}\') in
-
(select ss
-
from (select replace(sys_connect_by_path(c, \',\'), \',\') ss
-
from (select rownum i, chr(65 + rownum - 1) c
-
from dual
-
connect by rownum <= 26)
-
connect by prior i = i - 1)
- where length(ss) >= 2)
如果是數字,那麼應用的情況可能會有兩種:
第一種是從類似手機號碼這樣的字串中找出存在連續數字的(這種是從純數字中取)。
第二種是從字串中,找出存在連續數字的(這種字串是多種字元的組合,除數字外也可能含有英文及中文字元等,只是要取其中連續部分的數字來判斷)
第二種比較簡單,跟前面介紹的方法類似。第一種的話,可能不僅連續數字需要查,而且還有相同數字的需求,所以,可以這樣實現:
點選(此處)摺疊或開啟
-
with
-
tmp1 as(select rownum - 1 r from dual connect by rownum <= 10),
-
tmp2 as(select lpad(a.r, b.r, a.r) rr from tmp1 a, tmp1 b),
-
tmp3 as(
-
select rr from tmp2 where length(rr)>4
-
union all
-
select ss from (
-
select replace(sys_connect_by_path(n, \',\'), \',\') ss
-
from (select rownum i, to_char(rownum-1) n
-
from dual
-
connect by rownum <= 10)
-
connect by prior i = i - 1)
-
where length(ss) >= 4)
- select c_mobileno from taccoinfo a, tmp3 b where instr(a.c_mobileno, b.rr) > 0
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29734436/viewspace-1262023/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 求字串連續字元數量字串字元
- Oracle使用者密碼中含有特殊字元的登入辦法Oracle密碼字元
- 查詢字串中連續出現的字元字串字元
- 字元顯示亂碼問題處理辦法字元
- 31:字串中最長的連續出現的字元字串字元
- 06.字元和字串處理字元字串
- 字串本身重複字元的檢查辦法字串字元
- 如何快速處理證件文字識別
- 如何處理識別出的網路爬蟲爬蟲
- PowerShell的異常處理辦法
- 印表機usb連線電腦無法識別怎麼辦 印表機usb連線電腦無法識別的方法
- 將一個字串中含有全形的數字字元、字母、空格或'%+-()'字元轉換為相應半形字元字串字元
- 部分藍芽耳機 電腦 連線 不暢 的處理辦法藍芽
- 如何識別真假cpu-AMD處理器
- vnc遠端連線黑屏,vnc連線Linux後黑屏的處理辦法VNCLinux
- 尋找連續或不連續的子字串字串
- oracle rac修改ip的處理辦法Oracle
- oracle 表碎片太多的處理辦法Oracle
- QQ病毒的系列處理辦法(轉)
- secure crt(從windows)連線solaris,中文亂碼處理辦法Windows
- 語音識別----音高的處理
- C#中含有多個Main函式的處理C#AI函式
- Zsh 開發指南(四): 字串處理之萬用字元字串字元
- 轉:ORA-08177: 無法連續訪問此事務處理
- 【問題處理】MySQL忘記root密碼的處理辦法MySql密碼
- 磁碟IO過高時的處理辦法
- 如何處理telnet turbo linux es10好慢的辦法Linux
- shell 字元處理字元
- 特殊字元的處理。。¥$$$字元
- 如何處理 MySQL 萬用字元的模糊查詢MySql字元
- 關於Android程式設計檔案路徑中含有中文字元的問題解決辦法Android程式設計字元
- Java讀取檔案中含有中文的解決辦法 (轉)Java
- 【環境配置】ubuntu中shell命令不能識別萬用字元的解決辦法之一Ubuntu字元
- ORA-08177: 無法連續訪問此事務處理 (轉載)
- 字串處理字串
- delphi中的字串處理,以及幾個字串型別的說明。 (轉)字串型別
- (轉)oracle redolog損壞的處理辦法Oracle Redo
- oracle密碼過期處理辦法Oracle密碼