介绍Erlang的正则表达式模块re
(这个模块设计的内容都是ASCII编码,解析的过程不涉及Unicode)
1. 正则表达式的总结:
\\ 转义字符
. 除了换行符之外匹配任意字符(默认不匹配换行符,我们可以使用dotall option来让它匹配换行符)
* 0个或者多个quantifier
+ 1个或者多个quantifier.
\\w 任意的'word'(范围是a-z,A-Z,_,0-9)
2. 使用re来测试正则表达式的匹配:
re:run(Subject,RE,Options)
这个函数的缺点是一次只能匹配Subject中一个满足条件的,如果要匹配全部,需要自己代码完成.
例如:
re:run("abcdabc","abc",[]). %% 匹配abc,只匹配第一个,默认offset为0
{match,[{0,3}]}
re:run("abcdabc",[{offset,3}]). %%%% 匹配abc,从"abcdabc" -> 的子串"dabc"
{match,[{4,[{capture,all,list}]). %% 以list的形式返回结果
{match,["abc"]}
re:run("abcdabd","ab(c|d)",list}]). %% 以list的形式返回结果,包含group
{match,["abc","c"]}
re:run("abcdabd",first,list}]). %% 以list的形式返回结果,不包含group
{match,list},{offset,3}]). %% 以list的形式返回结果,不包含group,子串匹配.
{match,["abd"]}
3. 匹配邮件地址:
一个可以匹配Subject中所有邮件地址的函数:
匹配邮件使用的正则表达式是: \\w+@\\w+\\.\\w+
(这个表达式并不完善,但是现在测试下来可以工作:)
代码:
-module(util).
-compile(export_all).
parse_email(Subject) ->
parse_email(Subject,[]).
parse_email(Subject,Offset,Acc) ->
RE = "\\w+@\\w+\\.\\w+",%% 匹配Email的正则表达式
case re:run(Subject,[dotall,{capture,index},Offset}]) of
nomatch ->
Acc;
{match,[{Index,Len}]} ->
case re:run(Subject,Offset} ]) of
nomatch ->
error;
{match,[Match]} ->
parse_email(Subject,Index + Len,[Match|Acc])
end
end.
测试:
Subject = "liqiang@gmail.com tfs@gmail.com adfa,dasfad tfs3@gmail.com adfasd",SubjectBin = <<"liqiang@gmail.com tfs@gmail.com adfa,dasfad tfs3@gmail.com adfasd">>,util:parse_email(Subject).
["tfs3@gmail.com","tfs@gmail.com","liqiang@gmail.com"]
util:parse_email(SubjectBin).
["tfs3@gmail.com","liqiang@gmail.com"]
4. 删除HTML文档中的HTML标签:
代码:
-module(util).
-compile(export_all).
remove_html_tag(Data) ->
remove_html_tag(Data,0).
remove_html_tag(Data,Offset) ->
case re:run(Data,"<.*?>",Offset}]) of
nomatch ->
Data;
{match,_Len}]}->
%% 注意: Offset = Index,以为长度为Len的数据已经被替换成[]
remove_html_tag(re:replace(Data,"",{return,list}]),Index)
end.
测试:
Data = "<html><body>test<font>liqiang</font>@gmail.com</body></html>",util:remove_html_tag(Data).
"testliqiang@gmail.com" %%观察测试结果,当前版本的解析函数存在问题(当tag去掉之后,文本内容可能连接到一起)
util:remove_html_tag(Data).
"test liqiang@gmail.com" %%观察测试结果
转载自:http://veniceweb.googlecode.com/svn/trunk/public/daily_tech_doc/erlang_re_20091201.txt