介绍Erlang的正则表达式模块re

来源:互联网 发布:微模板源码 编辑:程序博客网 时间:2024/06/03 13:18
介绍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", "abc", [{offset, 3}]).  %%%% 匹配abc, 从"abcdabc" -> 的子串"dabc"{match,[{4,3}]}re:run("abcdabc", "abc", [{capture, all, list}]). %% 以list的形式返回结果{match,["abc"]}re:run("abcdabd", "ab(c|d)", [{capture, all, list}]).  %% 以list的形式返回结果, 包含group{match,["abc","c"]}re:run("abcdabd", "ab(c|d)", [{capture, first, list}]). %% 以list的形式返回结果, 不包含group{match,["abc"]}re:run("abcdabd", "ab(c|d)", [{capture, first, list}, {offset, 3}]). %% 以list的形式返回结果, 不包含group, 子串匹配.{match,["abd"]}3. 匹配邮件地址:一个可以匹配Subject中所有邮件地址的函数:匹配邮件使用的正则表达式是: \\w+@\\w+\\.\\w+(这个表达式并不完善,但是现在测试下来可以工作:)代码:-module(util).-compile(export_all).parse_email(Subject) ->    parse_email(Subject, 0, []).parse_email(Subject, Offset, Acc) ->    RE = "\\w+@\\w+\\.\\w+", %% 匹配Email的正则表达式    case re:run(Subject, RE, [dotall, {capture, first, index}, {offset, Offset}]) ofnomatch ->    Acc;{match, [{Index, Len}]} ->    case re:run(Subject, RE, [dotall, {capture, first, list}, {offset, Offset} ]) ofnomatch ->    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","tfs@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, "<.*?>", [dotall, {capture, first, index}, {offset, Offset}]) ofnomatch ->    Data;{match, [{Index, _Len}]}->    %% 注意: Offset = Index, 以为长度为Len的数据已经被替换成[]    remove_html_tag(re:replace(Data, "<.*?>", "", [dotall, {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
0 0
原创粉丝点击