Archive for March 31st, 2008

erlang的regexp模块

Monday, March 31st, 2008

regexp

翻译: gashero

目录

应用于字符串的正则表达式函数。

1   导出函数

1.1   match(String,RegExp) -> MatchRes

String=RegExp=string()
MatchRes={match,Start,Length} | nomatch | {error,errordesc()}
Start=Length=integer()

在字符串String中寻找正则表达式RegExp的第一个最长的匹配。搜索最长可能匹配,如果几个结果相同则返回第一个。返回如下:

  1. {match,Start,Length} :匹配成功,返回开始和长度。
  2. nomatch :无法匹配。
  3. {error,Error} :发生错误。

1.2   first_match(String,RegExp) -> MatchRes

String=RegExp=string()
MatchRes={match,Start,Length} | nomatch | {error,errordesc()}
Start=Length=integer()

寻找第一个匹配,通常比 match 更快,并确定匹配的存在与否。返回值同 match 。

1.3   matches(String,RegExp) -> MatchRes

String=RegExp=string()
MatchRes={match,MatchRes} | {error,errordesc()}
MatchRes=list()

返回所有的不重叠匹配结果,返回如下:

  1. {match,Matches} :如果正则表达式是正确的,哪么如果没有匹配则返回空的列表。每个元素都是形如 {Start,Length} 的元组。
  2. {error,Error} :正则表达式有错。

1.4   sub(String,RegExp,New) -> SubRes

String=RegExp=New=string()
SubRes={ok,NewString,RepCount} | {error,errordesc()}
RepCount=integer

将第一个匹配成功的子字符串替换成New。字符串New中的 & 符号代表被替换掉的字符串,而 & 则代表原来的 & 符号。返回结果如:

  1. {ok,NewString,RepCount} :如果正则表达式正确,则RepCount为替换执行的次数,为0或1。
  2. {error,Error} :正则表达式有误。

1.5   gsub(String,RegExp,New) -> SubRes

基本等同于 sub ,不同在于所有的不重叠会被替换,而不仅仅是替换一次。

1.6   split(String,RegExp) -> SplitRes

String=RegExp=string()
SubRes={ok,FieldList} | {error,errordesc()}
FieldList=[string()]

通过正则表达式将字符串切割成多个字段。如果分隔字符是空格 ” ” ,则分隔字符也隐含包括TAB字符。其他分隔字符没有此效应。返回值如下:

  1. {ok,FieldList} :字符串已经被切分成各个字段了。
  2. {error,Error} :正则表达式有误。

1.7   sh_to_awk(ShRegExp) -> AwkRegExp

ShRegExp=AwkRegExp=string()
SubRes={ok,NewString,RepCount} | {error,errordesc()}
RepCount=integer()

转换sh类型的正则表达式到awk类型的正则表达式。返回转换过的字符串。sh正则表达式是给shell用于匹配文件名用的,支持如下特殊字符:

    • :匹配任何数量任何字符
  1. ? :匹配单一任意字符
  2. […] :匹配范围内的字符,字符范围用符号 – 来分隔。如果第一个字符是 ! 则是相反的匹配。

尽管sh正则表达式并不强大,但在大多数时候却很好用。

1.8   parse(RegExp) -> ParseRes

RegExp=string()
ParseRes={ok,RE} | {error,errordesc()}

转换正则表达式字符串到可供其他正则表达式函数使用的内部格式。可以在调用其他函数时替换正则表达式的位置。这对于同一个正则表达式需要使用多次时非常有效。返回值:

  1. {ok,RE} :匹配成功则返回内部表示法。
  2. {error,Error} :正则表达式有误。

1.9   format_error(ErrorDescription) -> Chars

ErrorDescriptor=errordesc()
Chars=[char() | Chars]

在匹配失败时返回匹配错误的描述信息。

2   正则表达式

这里提到的正则表达式知识 egrep 和AWK语言中的子集。他们由如下字符组成:

c 非特殊意义的字母c
\c 匹配转码序列或字面上的c
. 匹配任意字符
^ 字符串开头
$ 字符串结尾
[abc…] 字符类,即指定字符组成的集合。字符范围是两个字符用 – 连接
[^abc…] 否定字符类,不匹配集合中的字符
r1 | r2 轮流,匹配r1或r2
r1r2 串联,匹配r1并且r2
r+ 匹配一个或更多的r
r* 匹配零个或多个的r
r? 匹配零个或一个的r
分组,匹配r

转码序列允许等同于Erlang字符串:

\b 退格
\f 换页(form feed)
\n 换行(line feed)
\r 回车
\t TAB
\e escape ESC
\v 纵向TAB
\s 空格
\d 删除
\ddd 八进制值ddd
\c 任何除了上面字符以外的,如\或”

可以让这些函数工作的更方便,比如在 io:get_line 中读取新行,当然字符 $ 也会匹配 “…n” 。如下例子时Erlang一些数据类型的正则表达式:

Atoms [a-z][0-9a-zA-Z_]*
Variables [A-Z_][0-9a-zA-Z_]*
Floats (\+|-)?[0-9]+\.[0-9]+((E|e)(\+|-)?[0-9]+)?

正则表达式是以Erlang字符串来编写的。这意味着字符 \ 或 ” 必须以转码方式来书写。例如浮点数的正则表达式就是: (\\+|-)?[0-9]+\\.[0-9]+((E|e)(\\+|-)?[0-9]+)?

正则表达式并不是一定要有转义序列字符的,他们可以自动生成。除了用在不同的地方,否则与普通的Erlang字符串是一样的。

3   作者

Robert Virding – support@erlang.ericsson.se

erlang的string模块

Monday, March 31st, 2008

string

翻译: gashero

目录

字符串处理函数库。

1   导出函数

1.1   len(String) -> Length

String=string()
Length

返回字符串的字符数。

1.2   equal(String1,String2) -> bool()

String1=String2=string()

测试两个字符串是否相等,如果相等返回 true ,不相等返回 false

1.3   concat(String1,String2) -> String3

String1=String2=String3=string()

连接两个字符串成为新的字符串,返回新的字符串。

1.4   chr(String,Character) -> Index

String=string()
Character=char()
Index=integer()

返回一个字符串中某个字符第一次出现的位置,如果不存在则返回0。

函数 rchr 拥有相同参数,但是从右侧开始计算。

1.5   str(String,SubString) -> Index

String=SubString=string()
Index=integer()

返回子串匹配位置,未匹配则返回0。例如:

> string:str(" Hello Hello World World ", "Hello World").
8

函数 rstr 拥有相同参数,但是从右侧开始计算。

1.6   span(String,Chars) -> Length

String=Chars=string()
Length=integer()

返回String匹配Chars中最多字符长度,从前开始。例如:

> string:span("\t    abcdefg"," \t").
5
> string:cspan("\t    abcdefg"," \t").
0

函数 cspan 则是取从前开始第一个匹配时前面不匹配的部分。后面的Chars可以包含多个字符用于匹配。

1.7   substr(String,Start[,Length]) -> SubString

String=SubString=string()
Start=Length=integer()

取得字符串的子字符串,可以指定开始处和长度,长度可省略。例如:

> string:substr("Hello World",4,5).
"lo Wo"

1.8   tokens(String,SeparatorList) -> Tokens

String=SeparatorList=string()
Tokens=[string()]

根据分隔符号列表中的字符将字符串切割成词法符号。例如:

> string:tokens("abc defxxghix jkl","x ").
["abc","def","ghi","jkl"]

1.9   chars(Character,Number[,Tail]) -> String

Character=char()
Number=integer()
String=string()

返回包含指定数目个字符的字符串,可选的指定随后跟着的字符串Tail。

1.10   copies(String,Number) -> Copies

String=Copies=string()
Number=integer()

返回包含指定数量份复制过的字符串。

1.11   words(String[,Character]) -> Count

String=string()
Character=char()
Count=integer()

返回字符串中的单词个数,分隔符可以在第二个可选参数指定。例如:

> string:words(" Hello old boy!",$o).
4

注意分隔字符必须以美元符号开头,后面指定,如上的 $o

1.12   sub_word(String,Number[,Character]) -> Word

String=Word=string()
Character=char()
Number=integer()

返回指定位置的单词,单词间的分隔符定义同上。注意这里的位置数字是以1开始的。例如:

> string:sub_word(" Hello old boy !",3,$o).
"ld b"

1.13   strip(String[,Direction[,Character]]) -> Stripped

String=Stripped=string()
Direction=left | right | both
Character=char()

返回去掉了两端空白的字符串,可以指定方向和空白字符。 strip/1 等同于 strip(String,both) 。例如:

> string:strip("...Hello.....",both,$.).
"Hello"

1.14   left(String,Number[,Character]) -> Left

String=Left=string()
Character=char
Number=integer()

返回从左起,调整过长度为指定数字的字符串,可以指定后面跟的填充字符,默认为空格。如果字符串太长也不会被截断。例如:

> string:left("Hello",10,$.).
"Hello....."

函数 right 拥有相同的参数,只不过会将字符串右对齐。

1.15   centre(String,Number[,Character]) -> Centered

String=Centered=string()
Character=char
Number=integer()

将字符串中间对齐扩充到指定长度,不足不用用空格或指定字符填充。

1.16   sub_string(String,Start[,Stop]) -> SubString

String=SubString=string()
Start=Stop=integer()

返回字符串的子字符串,可以指定开始位置和结束位置。例如:

> string:sub_string("Hello World",4,8).
"lo Wo"

注意不同于 substr 的指定开始和长度,这个函数是指定开始和结束。

1.17   to_float(String) -> {Float,Rest} | {error,Reason}

String=string()
Float=float()
Rest=string()
Reason=no_float | not_a_list

将一个开始于浮点数的字符串转换成浮点数,剩余无法识别的会返回。例如:

> {F1,Fs}=string:to_float("1.0-1.0e-1"),
> {F2,[]}=string:to_float(Fs),
> F1+F2.
0.900000
> string:to_float("3/2=1.5").
{error,no_float}
> string:to_float("-1.5eX").
{-1.50000,"eX"}

1.18   to_integer(String) -> {Int,Rest} | {error,Reason}

String=string()
Int=integer()
Rest=string()
Reason= no_integer | not_a_list

将参数中以整数开头的字符串转换成整数和剩余部分。例如:

> {I1,Is}=string:to_integer("33+22"),
> {I2,[]}=string:to_integer(Is),
> I1-I2.
11
> string:to_integer("0.5").
{0,".5"}
> string:to_integer("x=2").
{error,no_integer}

1.19   to_lower(String) -> Result

String=Result=string()
Char=CharResult=integer()

将字符或字符串转换成大写或小写的形式。其他形式:

to_lower(Char) -> CharResult
to_upper(String) -> Result
to_upper(Char) -> CharResult

2   注意

这里面有些函数看起来有点像,这是因为 string 包是由以前的两个包合并而成,以前的函数全部都保留下来了。

正则表达式函数放在了独立的模块 regexp 中了。旧的入口点为了向后兼容也保留了,不过在未来的发行版中会取消,所以建议用户使用新的模块。

string 中没有文档化的函数不要使用。

3   作者

Robert Virding – support@erlang.ericsson.se

Torbjorn Tornkvist – support@erlang.ericsson.se