字符串
字符串(String),是由零個或多個字符組成的有限串行。一般記為s=a_1 a_2\dots a_n (0\leq n \lneq\infty)。它是編程語言中表示文本的數據類型。
通常以串的整體作為操作對象,如:在串中查找某個子串、求取一個子串、在串的某個位置上插入一個子串以及刪除一個子串等。兩個字符串相等的充要條件是:長度相等,并且各個對應位置上的字符都相等。設p、q是兩個串,求q在p中首次出現的位置的運算叫做模式匹配。串的兩種最基本的存儲方式是順序存儲方式和鏈接存儲方式。
字符串函數[ ]
- 連接運算 concat(s1,s2,s3…sn) 相當于s1+s2+s3+…+sn.
例:concat(‘11’,'aa’)='11aa’;
- 求子串。 Copy(s,I,L) 從字符串s中截取第I個字符開始后的長度為l的子串。
例:copy(‘abdag’,2,3)=’bda’
- 刪除子串。過程 Delete(s,I,l) 從字符串s中刪除第I個字符開始后的長度為l的子串。
例:s:=’abcde’;delete(s,2,3);結果s:=’ae’
- 插入子串。 過程Insert(s1,s2,I) 把s1插入到s2的第I個位置
例:s:=abc;insert(‘12’,s,2);結果s:=’a12bc’
- 求字符串長度 length(s) 例:length(‘12abc’)=5
在ASP中 求字符串長度用 len(s)例: len("abc12")=5
- 搜索子串的位置 pos(s1,s2) 如果s1是s2的子串 ,則返回s1的第一個字符在s2中的位置,若不是子串,則返回0.
例:pos(‘ab’,’12abcd’)=3
- 字符的大寫轉換。Upcase(ch) 求字符ch的大寫體。
例:upcase(‘a’)=’A’
- 數值轉換為數串。 過程 Str(x,s) 把數值x化為數串s.
例:str(12345,s); 結果s=’12345’
- 數串轉換為數值。 過程val(s,x,I) 把數串s轉化為數值x,如果成功則I=0,不成功則I為無效字符的序數
例:val(‘1234’,x,I);結果 x:=1234
字符串操作[ ]
一個簡單的字符串操作是“連接”:也就是說先寫一個字符串S,隨后在后面再寫一個T得到ST這樣一個過程。 其它的常見操作包括在一個長字符串中搜索一個子串,排列一組字符串
以及分析一個字符串。因為存在如此多的字符串應用方式,所以相應地有許多權衡了不同應用的相關算法。 高級的字符串算法通常使用包括后向樹和有限狀態(tài)機在內的復雜機制和
數據結構。
字符編碼[ ]
歷史上,字符串數據類型為每個字符分配一個字節(jié),盡管精確的字符集隨著區(qū)域而改變,字符編碼足夠類似得程序員可以忽略它 — 同一個系統(tǒng)在不同的區(qū)域中使用的字符集組要
么讓一個字符在同樣位置,要么根本就沒有它。這些字符集典型的基于ASCII碼或EBCDIC碼。 意音文本的語言比如漢語、日語和朝鮮語(合稱為CJK)的合理表示需要多于256個字符(每字符一個字節(jié)編碼的極限)。常規(guī)的解決涉及保持對ASCII碼的單字節(jié)表示并使用雙字節(jié)來表示
CJK字形?,F存代碼在用到它們會導致一些字符串匹配和切斷上的問題,嚴重程度依賴于字符編碼是如何設計的。某些編碼比如EUC家族保證在ASCII碼范圍內的字節(jié)值只表示ASCII字
符,使得使用這些字符作為字段分隔符的系統(tǒng)得到編碼安全。其他編碼如ISO-2022和Shift-JIS不做這種擔保,使得基于字節(jié)的代碼做的匹配不安全。另一個問題是如果一個字符串的
開頭被刪除了,對解碼器的重要指示或關于在多字節(jié)序列中的位置的信息可能就丟失了。另一個問題是如果字符串被連接到一起(特別是在被不知道這個編碼的代碼截斷了它們的結尾
之后),第一個字符串可能不能導致編碼器進入適合處理第二個字符串的狀態(tài)中。 Unicode也有些復雜的問題。多數語言有Unicode字符串數據類型(通常是UTF- 16,因為它在Unicode補充位面介入之前就被增加了)。在Unicode和本地編碼之間轉換要求理解本地編
碼,這對于現存系統(tǒng)要一起傳輸各種編碼的字符串而又沒有實際標記出它們用了什么編碼就是個問題。
算法[ ]
這是一些字符串處理算法,在字符串上進行不同的處理:
字符串查找算法
正則表達式算法
模式匹配
字符串的匹配算法(kmp)。
相關條目[ ]