erlang的regexp模块

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

Leave a Reply