文档库 最新最全的文档下载
当前位置:文档库 › 字符串

字符串

字符串

字符串主要用于编程,概念说明、函数解释、用法详述见正文,这里补充两点
:1.Free Pascal中的Ansistring只能看成整体,很多函数无法使用,就算是提
取单个元素也很麻烦,所以除非万不得已就不要用;2.字符串在存储上类似字
符数组,所以它每一位的单个元素都是可以提取的,如s=“aaaaabbbbb”,则s
【1】=“a”,s【10】="b",而字符串的零位正是它的长度,如s【0】=10(※
上述功能Ansistring没有。),这可以给我们提供很多方便,如高精度运算时
每一位都可以转化为数字存入数组。
简介

字符串或串(String)是由数字、字母、下划线组成的一串字符。一般记为 s=“
a1a2···an”(n>=0)。它是编程语言中表示文本的数据类型。

通常以串的整体作为操作对象,如:在串中查找某个子串、求取一个子串、在
串的某个位置上插入一个子串以及删除一个子串等。两个字符串相等的充要条
件是:长度相等,并且各个对应位置上的字符都相等。设p、q是两个串,求q在
p中首次出现的位置的运算叫做模式匹配。串的两种最基本的存储方式是顺序存
储方式和链接存储方式。
函数应用

1. 连接运算 concat(s1,s2,s3…sn) 相当于s1+s2+s3+…+sn.

例:concat(‘11’,'aa’)='11aa’;

2. 求子串。 Copy(s,I,I) 从字符串s中截取第I个字符开始后的长度为l的子串


例:copy(‘abdag’,2,3)=’bda’

3. 删除子串。过程 Delete(s,I,l) 从字符串s中删除第I个字符开始后的长度
为l的子串。

例:s:=’abcde’;delete(s,2,3);结果s:=’ae’

4. 插入子串。 过程Insert(s1,s2,I) 把s1插入到s2的第I个位置

例:s:=abc;insert(‘12’,s,2);结果s:=’a12bc’

5. 求字符串长度 length(s) 例:length(‘12abc’)=5

在ASP中 求字符串长度用 len(s)例: len("abc12")=5

6. 搜索子串的位置 pos(s1,s2) 如果s1是s2的子串 ,则返回s1的第一个字符
在s2中的位置,若不是子串,则返回0.

例:pos(‘ab’,’12abcd’)=3

7. 字符的大写转换。Upcase(ch) 求字符ch的大写体。

例:upcase(‘a’)=’A’

8. 数值转换为数串。 过程 Str(x,s) 把数值x化为数串s.

例:str(12345,s); 结果s=’12345’

9. 数串转换为数值。 过程val(s,x,I) 把数串s转化为数值x,如果成功则I=0,
不成功则I为无效字符的序数

例:val(‘1234’,x,I);结果 x:=1234
病毒

“字符串(Trojan.String.a)”病毒:警惕程度★★★,木马病毒,通过网络
传播,依赖系统: WIN9X/NT/2000/XP。

该病毒通过网络传播,进入用户电脑后就隐藏在系统目录和内存中,病毒发作
时会给用户电脑造成以下破坏:

屏幕为空、无端打开CD驱动器、进行洪水攻击
、打开黄色网站等,用户要小心防毒。
形式理论

设 Σ 是叫做字母表的非空有限集合。Σ 的元素叫做“符号”或“字符”。在
Σ 上的字符串(或字)是来自 Σ 的任何有限序列。例如,如果 Σ = {0, 1},
则 0101 是在 Σ 之上的字符串。

字符串的长度是在字符串中字符的数目(序列的长度),它可以是任何非负整数
。“空串”是在 Σ 上的唯一的长度为 0 的字符串,并被指示为 ε 或 λ。

在 Σ 上的所有长度为 n 的字符串的集合指示为 Σn。例如,如果 Σ = {0,
1} 则 Σ2 = {00, 01, 10, 11}。注意 Σ0 = {ε} 对于任何字母表 Σ。

在 Σ 上的所有任何长度的字符串的集合是 Σ 的Kleene闭包并被指示为 Σ*
。 依据Σn, 。例如,如果 Σ = {0, 1} 则 Σ* = {ε, 0, 1, 00, 01, 10,
11, 000, 001, 010, 011, …}。尽管 Σ* 自身是可数无限的,Σ* 的所有元
素都有有限长度。

在 Σ 上一个字符串的集合(就是 Σ* 的任何子集)被称为在 Σ 上的形式语言
。例如,如果 Σ = {0, 1},则带有偶数个零的字符串的集合({ε, 1, 00,
11, 001, 010, 100, 111, 0000, 0011, 0101, 0110, 1001, 1010, 1100,
1111, …})是在 Σ 上的形式语言。
串接子串

“串接”是 Σ* 上的重要二元运算。对于 Σ* 中的两个字符串 s 和 t,它们
的串接被定义为在 s 中的字符序列之后跟随着 t 中的字符序列,并被指示为
st。例如,Σ = {a, b, …, z},并且 s = bear 且 t = hug,则 st =
bearhug 而 ts = hugbear。

字符串串接是结合性的,但非交换性运算。空串充当单位;对于任何字符串 s
,有 εs = sε = s。所以,集合 Σ* 和串接运算形成了幺半群,就是从 Σ
生成的自由幺半群。此外,长度函数定义从 Σ* 到非负整数的幺半群同态。

字符串 s 被称为是字符串 t 的“子串”或“因子”,如果存在(可能为空)字
符串 u 和 v 使得 t = usv。“是其子串”关系定义了在 Σ* 上的偏序,其最
小元是空串。
词典排序

经常需要定义在字符串集合上的次序。如果字符表 Σ 有一个全序 (cf. 字母

序),则可以定义在 Σ* 上的叫做词典序的全序。注意因为 Σ 是有限的,总

是可以定义在 Σ 继而在 Σ* 上的良好次序。例如,如果 Σ = {0, 1} 并且
0 < 1,则 Σ* 的词典次序是 ε < 0 < 00 < 000 < … < 011 < 0110 < … <
01111 < … < 1 < 10 < 100 < … < 101 < … < 111 …

运算

在形式理论中经常出现一些在字符串上的额外运算。它们在条目字符串运算中
给出。

数据类型

字符串数据类型是建模在形式字符串的想法上的数据类型。字符串

是几乎在所
有编程语言中可以实现的非常重要和有用的数据类型。在某些语言中它们可作
为基本类型获得,在另一些语言中做为复合类型获得。多数高级语言的语法允
许通常用某种方式引用起来的字符串来表示字符串数据类型的实例;这种元字
符串叫做“文本”或“字符串文本”。

长度

尽管形式字符串可以有任意(但有限)的长度,实际语言的字符串的长度经常被
限制到一个人工极大值。一般的说,有两种类型的字符串数据类型: “定长字
符串”,它有固定的极大长度并且不管是否达到了这个极大值都使用同样数量
的内存;和“变长字符串”,它的长度不是专断固定的并且依赖于实际的大小
使用可变数量的内存。在现代编程语言中的多数字符串是变长字符串。尽管叫
这个名字,所有变长字符串还是在长度上有个极限,一般的说这个极限只依赖
于可获得的内存的数量。
字符编码

历史上,字符串数据类型为每个字符分配一个字节,尽管精确的字符集随着区
域而改变,字符编码足够类似得程序员可以忽略它 — 同一个系统在不同的区
域中使用的字符集组要么让一个字符在同样位置,要么根本就没有它。这些字
符集典型的基于ASCII码或EBCDIC码。

意音文本的语言比如汉语、日语和朝鲜语(合称为CJK)的合理表示需要多于256
个字符(每字符一个字节编码的极限)。常规的解决涉及保持对ASCII码的单字节
表示并使用双字节来表示CJK字形。现存代码在用到它们会导致一些字符串匹配
和切断上的问题,严重程度依赖于字符编码是如何设计的。某些编码比如EUC家
族保证在ASCII码范围内的字节值只表示ASCII字符,使得使用这些字符作为字
段分隔符的系统得到编码安全。其他编码如ISO-2022和Shift-JIS不做这种担保
,使得基于字节的代码做的匹配不安全。另一个问题是如果一个字符串的开头
被删除了,对解码器的重要指示或关于在多字节序列中的位置的信息可能就丢
失了。另一个问题是如果字符串被连接到一起(特别是在被不知道这个编码的代
码截断了它们的结尾之后),第一个字符串可能不能导致编码器进入适合处理第
二个字符串的状态中。

Unicode也有些复杂的问题。多数语言有Unicode字符串数据类型(通常是UTF-16
,因为它在Unicode补充位面介入之前就被增加了)。在Unicode和本地编码之间
转换要求理解本地编码,这对于现存系统要一起传输各种编码的字符串而又没
有实际标记出它们用了什么编码就是个问题。

实现

某些语言如 C++ 把字符串实现为可以用于任何基本类型

的模版,但这是个例外
而不是规则。

如果一个面向对象语言把字符串表示为对象,它们叫做“可变的”(mutable),
如果值可以在进行时间变更,叫做“不变的”(immutable),如果这个值在建立
后就冻结了。例如,Ruby 有可变字符串,而 Python 的字符串是不可变的。

其他语言,最著名的有 Prolog 和 Erlang,避免实现字符串数据类型,转而采
用把字符串表示为字符代码的列表的约定。

表示法

一种常用的表示法是使用一个字符代码的数组,每个字符占用一个字节(如在
ASCII代码中)或两个字节(如在unicode中)。它的长度可以使用一个结束符
(一般是NUL,ASCII代码是0,在C编程语言中使用这种方法)。或者在前面加
入一个整数值来表示它的长度(在Pascal语言中使用这种方法)。

这是一个用NUL结束的字符串的例子,它用10个byte存储,用ASCII表示法:

F R A N K NUL k e f w

46 52 41 4E 4B 00 6B 66 66 77

上面的字符串的长度为5个字符,但注意它占用6个字节。结束符后的字符没有
任何意义。

这是相同的Pascal字符串:

length F R A N K k e f w

05 46 52 41 4E 4B 6B 66 66 77

当然,可能还有其它的表示法。使用树和列表可以使得一些字符串操作(如插
入和删除)更高效。

实用程序

一些编程语言设计为编写字符串处理程序更容易编写。这是一些例子:

awk

Icon

perl

MUMPS

sed

SNOBOL

很多UNIX实用程序进行简单的字符串处理,并能用于简单地编写一些强大的字
符串处理算法。文件和有限流可以像字符串一样查看。

一些新的编程语言,包括Perl、Python和Ruby,借助正则表达式来帮助文本处
理。

操作

一个简单的字符串操作是“连接”:也就是说先写一个字符串S,随后在后面再
写一个T得到ST这样一个过程。 其它的常见操作包括在一个长字符串中搜索一
个子串,排列一组字符串以及分析一个字符串。因为存在如此多的字符串应用
方式,所以相应地有许多权衡了不同应用的相关算法。 高级的字符串算法通常
使用包括后向树和有限状态机在内的复杂机制和数据结构。

算法

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

字符串查找算法

正则表达式算法

模式匹配

字符串的匹配算法(kmp)

AC自动机

PHP中介绍


[1] string是一系列字符。在 php 中,字符和字节一样,也就是说,一共有
256 种不同字符的可能性。这也暗示 php 对 Unicode 没有本地支持。请参阅
函数utf8_encode()和utf8_decode()以了解有关 Unic

ode 支持

注:一个字符串变得非常巨大也没有问题,php 没有给字符串的大小强加实现范
围,所以完全没有理由担心长字符串。

语法

字符串可以用三种字面上的方法定义。

单引号

双引号

定界符

单引号


指定一个简单字符串的最简单的方法是用单引号(字符 ')括起来。

要表示一个单引号,需要用反斜线(/)转义,和很多其它语言一样。如果在单
引号之前或字符串结尾需要出现一个反斜线,需要用两个反斜线表示。注意如

果试图转义任何其它字符,反斜线本身也会被显示出来!所以通常不需要转义
反斜线本身。

注:在 php 3 中,此情况下将发出一个 E_NOTICE 级的警告。

注:和其他两种语法不同,单引号字符串中出现的变量和转义序列不会被变量的
值替代。

newlines instrings this way as it isokay to do';// Outputs: Arnold
once said: "I'll be back"echo 'Arnold once said: "I/'ll be back"';//
Outputs: You deleted C:/*.*?echo 'You deleted C://*.*?';// Outputs:
You deleted C:/*.*?echo 'You deleted C:/*.*?';// Outputs: This will
not expand: /n a newlineecho 'This will not expand: /n a newline';//
Outputs: Variables do not $expand $eitherecho 'Variables do not
$expand $either';?>

此外,如果试图转义任何其它字符,反斜线本身也会被显示出来!

双引号字符串最重要的一点是其中的变量名会被变量值替代。细节参见字符串
解析。

定界符

另一种给字符串定界的方法使用定界符语法(“<<<”)。应该在 <<< 之后提
供一个标识符,然后是字符串,然后是同样的标识符结束字符串。

结束标识符必须从行的第一列开始。同样,标识符也必须遵循 php 中其它任何
标签的命名规则:只能包含字母数字下划线,而且必须以下划线或非数字字符
开始。

例子 11-3. 非法的例子



定界符文本表现的就和双引号字符串一样,只是没有双引号。这意味着在定界
符文本中不需要转义引号,不过仍然可以用以上列出来的转义代码。变量会被
展开,但当在定界符文本中表达复杂变量时和字符串一样同样也要注意。

例子 11-4. 定界符字符串例子

heredoc syntax.EOD;/* More complex example, with variables. */class
foo{ var $foo; var $bar; function foo() { $this->foo = 'Foo'; $this-
>bar = array('Bar1', 'Bar2', 'Bar3'); }}$foo = new foo();$name =
'MyName';echo <<>foo.Now, I am printing some {$foo->bar[1]}.This should print a
capital 'A': /x41EOT;?>注:定界符支持是 php 4 中加入的。

变量解析

当用双引号或者定界符指定字符串时,其中的变量会被解析。

有两种语法,一种简单的和一种复杂的。简单语法最通用和方便,它提供了解
析变量,数组值,或者对象属性的方法。

复杂语法是 php 4 引进的,可以用花括号括起一个表达式。

简单语法如果遇到美元符号($),解析器会尽可能多地取得后面的字符以组成
一个合法的变量名。如果想明示指定名字的结束,用花括号把变量名括起来。

is an invalid character for varnamesecho "He drank some $beers"; //
won't work, 's' is a valid character for varnamesecho "He drank some
${beer}s"; // worksecho "He drank some {$beer}s"; // works?>

同样也可以解析数组索引或者对象属性。对于数组索引,右方括号(])标志着
索引的结束。对象属性则和简单变量适用同样的规则,尽管对于对象属性没有
像变量那样的小技巧。

strings.// When outside of a string, always quote your array string
keys// and do not use {braces} when outside of strings either.//
Let's show all errorserror_reporting(E_ALL);$fruits = array
('strawberry' => 'red', 'banana' => 'yellow');// Works but note that
this works differently outside string-quotesecho "A banana is
$fruits[banana].";// Worksecho "A banana is {$fruits['banana']}.";//
Works but php looks for a constant named banana first// as described
below.echo "A banana is {$fruits[banana]}.";// Won't work, use
braces. This results in a parse error.echo "A banana is $fruits
['banana'].";// Worksecho "A banana is " . $fruits['banana'] . ".";//
Worksecho "This square is $square->width meters broad.";// Won't
work. For a solution, see the complex syntax.echo "This square is
$square->width00 centimeters broad.";?>

对于任何更复杂的情况,应该使用复杂语法。

复杂(花括号)语法不是因为语法复杂而称其为复杂,而是因为用此方法可以
包含复杂的表达式。

事实上,用此语法可以在字符串中包含任何在名字空间的值。仅仅用和在字符
串之外同样的方法写一个表达式,然后用 { 和 } 把它包含进来。因为不能转
义“{”,此语法仅在 $ 紧跟在 { 后面时被识别(用“{/$”或者“/{$”来得
到一个字面上的“{$”)。用一些例子可以更清晰:

'fantastic';// 不行,输出为:This is { fantastic}echo "This is {
$great}";// 可以,输出为:This is fantasticecho "This is
{$great}";echo "This is ${great}";// Worksecho "This square is
{$square->width}00 centimeters broad.";// Worksecho "This works:
{$arr[4][3]}";// This is wrong for the same reason as $foo[bar] is
wrong// outside a string. In

otherwords, it will still work but//
because php first looks for a constant named foo, it will// throw an
error of level E_NOTICE (undefined constant).echo "This is wrong:
{$arr[foo][3]}";// Works. When using multi-dimensional arrays, always
use// braces around arrays when inside of stringsecho "This works:
{$arr['foo'][3]}";// Works.echo "This works: " . $arr['foo'][3];echo
"You can even write {$obj->values[3]->name}";echo "This is the value
of the var named $name: {${$name}}";?>

访问和修改字符串中的字符

字符串中的字符可以通过在字符串之后用花括号指定所要字符从零开始的偏移
量来访问和修改。

注:为了向下兼容,仍然可以用方括号。不过此语法自 php 4 起已过时。

例子 11-5. 一些字符串例子

$first = $str{0};// Get the third character of a string$third = $str
{2};// Get the last character of a string.$str = 'This is still a
test.';$last = $str{strlen($str)-1};// Modify the last character of a
string$str = 'Look at the sea';$str{strlen($str)-1} = 'e';?>

实用函数



字符串可以用“.”(点)运算符连接。注意这里不能用“+”(加)运算符。
更多信息参见字符串运算符。

有很多实用函数来改变字符串。

普通函数见字符串函数一节,高级搜索和替换见正则表达式函数(两种风格:
Perl 和 POSIX 扩展)。

还有 URL 字符串函数,以及加密/解密字符串的函数(mcrypt 和 mhash)。

最后,如果还是找不到想要的函数,参见字符类型函数。

转换



可以用 (string) 标记或者strval()函数将一个值转换为字符串。当某表达式
需要字符串时,字符串的转换会在表达式范围内自动完成。例如当使用echo()
或者print()函数时,或者将一个变量值与一个字符串进行比较的时候。阅读手
册中有关类型和类型戏法中的部分有助于更清楚一些。参见settype()。[2]

布尔值TRUE将被转换为字符串 "1",而值FALSE将被表示为 ""(即空字符串)
。这样就可以随意地在布尔值和字符串之间进行比较。

整数或浮点数数值在转换成字符串时,字符串由表示这些数值的数字字符组成
(浮点数还包含有指数部分)。

数组将被转换成字符串 "Array",因此无法通过echo()或者print()函数来输出
数组的内容。请参考下文以获取更多提示。

对象将被转换成字符串 "Object"。如果因为调试需要,需要将对象的成员变量
打印出来,请阅读下文。如果希望得到该对象所依附的类的名称,请使用函数
get_class()。自 php 5 起,如果合适可以用 __toString() 方法。

资源类型总是以 "Resource id #1" 的格式被转换成字符串,其中 1 是 php
在运行时给资源指定的唯一标识。如果希望获取

资源的类型,请使用函数
get_resource_type()。

NULL将被转换成空字符串。

正如以上所示,将数组、对象或者资源打印出来,并不能提供任何关于这些值
本身的有用的信息。请参阅函数print_r()和var_dump(),对于调试来说,这些
是更好的打印值的方法。

可以将 php 的值转换为字符串以永久地储存它们。这种方法被称为序列化,可
以用函数serialize()来完成该操作。如果在安装 php 时建立了 WDDX 支持,
还可以将 php 的值序列化为 XML 结构。

转换数值

当一个字符串被当作数字来求值时,根据以下规则来决定结果的类型和值。

如果包括“.”,“e”或“E”其中任何一个字符的话,字符串被当作float来
求值。否则就被当作整数。

该值由字符串最前面的部分决定。如果字符串以合法的数字数据开始,就用该
数字作为其值,否则其值为 0(零)。合法数字数据由可选的正负号开始,后
面跟着一个或多个数字(可选地包括十进制分数),后面跟着可选的指数。指
数是一个“e”或者“E”后面跟着一个或多个数字。

// $foo is float (-1299)$foo = 1 + "bob-1.3e3"; // $foo is integer
(1)$foo = 1 + "bob3"; // $foo is integer (1)$foo = 1 + "10 Small
Pigs"; // $foo is integer (11)$foo = 4 + "10.2 Little Piggies"; //
$foo is float (14.2)$foo = "10.0 pigs " + 1; // $foo is float
(11)$foo = "10.0 pigs " + 1.0; // $foo is float (11)?>

此转换的更多信息见 Unix 手册中关于 strtod(3) 的部分。

如果想测试本节中的任何例子,可以拷贝和粘贴这些例子并且加上下面这一行
自己看看会发生什么:

/n";?>

不要指望在将一个字符转换成整型时能够得到该字符的编码(可能也会在 C 中
这么做)。如果希望在字符编码和字符之间转换,请使用ord()和chr()函数。

相关文档