Erlang日期处理求助:提取年月日及正则与模式匹配问题
Erlang日期处理问题解答
我来帮你搞定这两个Erlang日期相关的问题,咱们一步步拆解:
1. 从指定日期字符串提取年、月、日
这里有几种实用的方法,你可以根据场景选择:
方法一:字符串拆分(最简洁)
用Erlang标准库的string:split/3按-分割字符串,再转成整数:
DateStr = "2018-05-25", [YearStr, MonthStr, DayStr] = string:split(DateStr, "-", all), Year = list_to_integer(YearStr), Month = list_to_integer(MonthStr), Day = list_to_integer(DayStr).
这种方式代码清晰,还能直接得到可用于calendar模块的整数类型年、月、日。
方法二:固定格式的模式匹配
如果你确定日期字符串是严格的YYYY-MM-DD格式,也可以用模式匹配,但要注意匹配每个字符的位置:
[Y1,Y2,Y3,Y4, $-, M1,M2, $-, D1,D2] = "2018-05-25", Year = list_to_integer([Y1,Y2,Y3,Y4]), Month = list_to_integer([M1,M2]), Day = list_to_integer([D1,D2]).
之前你的模式匹配失败,是因为模式长度和字符串不匹配(目标字符串是10个字符,你的模式只有5个元素),而且没必要用$45表示-,直接写$-更直观。
2. 正则匹配与模式匹配的问题修复
正则匹配失败的原因
你用的re:run("2018-05-25", <<"^\d{4}-\d{2}-\d{2}$">>)有两个关键问题:
- Erlang里的正则表达式,
\d需要双重转义:因为在二进制或字符串中,\本身是转义字符,所以要写成\\d才能被正则引擎识别为数字匹配符。 - 修正后的正确调用如下:
% 二进制正则写法 re:run("2018-05-25", <<"^\\d{4}-\\d{2}-\\d{2}$">>). % 字符串正则写法 re:run("2018-05-25", "^\\d{4}-\\d{2}-\\d{2}$").
如果想同时提取年、月、日,可以用捕获组:
{match, [YearStr, MonthStr, DayStr]} = re:run("2018-05-25", <<"^(\\d{4})-(\\d{2})-(\\d{2})$">>, [{capture, all_but_first, list}]), Year = list_to_integer(YearStr), Month = list_to_integer(MonthStr), Day = list_to_integer(DayStr).
模式匹配失败的补充说明
除了长度不匹配的问题,你用$45表示-虽然技术上正确(因为-的ASCII码是45),但Erlang支持直接用$-表示该字符,写法更易读,所以推荐用后者。
内容的提问来源于stack exchange,提问作者Jon Riel
相关产品推荐
相关产品推荐

