个人工具
名字空间
变换
操作

字符串

来自站长百科
跳转到: 导航, 搜索

字符串(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这样一个过程。 其它的常见操作包括在一个长字符串中搜索一个子串,排列一组字符串

以及分析一个字符串。因为存在如此多的字符串应用方式,所以相应地有许多权衡了不同应用的相关算法。 高级的字符串算法通常使用包括后向树和有限状态机在内的复杂机制和

数据结构



字符编码

历史上,字符串数据类型为每个字符分配一个字节,尽管精确的字符集随着区域而改变,字符编码足够类似得程序员可以忽略它 — 同一个系统在不同的区域中使用的字符集组要

么让一个字符在同样位置,要么根本就没有它。这些字符集典型的基于ASCII码或EBCDIC码。    意音文本的语言比如汉语、日语和朝鲜语(合称为CJK)的合理表示需要多于256个字符(每字符一个字节编码的极限)。常规的解决涉及保持对ASCII码的单字节表示并使用双字节来表示

CJK字形。现存代码在用到它们会导致一些字符串匹配和切断上的问题,严重程度依赖于字符编码是如何设计的。某些编码比如EUC家族保证在ASCII码范围内的字节值只表示ASCII字

符,使得使用这些字符作为字段分隔符的系统得到编码安全。其他编码如ISO-2022和Shift-JIS不做这种担保,使得基于字节的代码做的匹配不安全。另一个问题是如果一个字符串的

开头被删除了,对解码器的重要指示或关于在多字节序列中的位置的信息可能就丢失了。另一个问题是如果字符串被连接到一起(特别是在被不知道这个编码的代码截断了它们的结尾

之后),第一个字符串可能不能导致编码器进入适合处理第二个字符串的状态中。    Unicode也有些复杂的问题。多数语言有Unicode字符串数据类型(通常是UTF- 16,因为它在Unicode补充位面介入之前就被增加了)。在Unicode和本地编码之间转换要求理解本地编

码,这对于现存系统要一起传输各种编码的字符串而又没有实际标记出它们用了什么编码就是个问题。



算法

这是一些字符串处理算法,在字符串上进行不同的处理:

字符串查找算法

正则表达式算法

模式匹配

字符串的匹配算法(kmp)。



相关条目



参考资源

参考资源1

参考资源2

留言