You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:22:34