使用 Regex.named_capture 从字符串中提取日期

Extract date from string using Regex.named_capture

我想将“My String 2022-01-07”之类的字符串提取到命名捕获中的日期部分。

我试过以下正则表达式,但它只在完全匹配时有效:

# Does not work
iex> Regex.named_captures(~r/(?<date>$?(\d{4}-\d{2}-\d{2})?)/, "My String 2021-01-01")
%{"date" => ""}

# Works
iex> Regex.named_captures(~r/(?<date>$?(\d{4}-\d{2}-\d{2})?)/, "2021-01-01")
%{"date" => "2021-01-01"}

我也尝试过,但没有成功:

iex> Regex.named_captures(~r/([a-zA-Z0-9 ]+?)(?<date>$?(\d{4}-\d{2}-\d{2})?)/, "My String 2021-01-01")
%{"date" => ""}

当您不关心日期周围的字符时,是否可以使用命名捕获来提取字符串的日期部分?

我想我正在寻找一个可以像这样工作的正则表达式:

iex> Regex.named_captures(REGEX???, "My String 2021-01-01 Other Parts")
%{"date" => "2021-01-01"}

你想要

Regex.named_captures(~r/(?<date>$?\d{4}-\d{2}-\d{2})/, "My String 2021-01-01")

您的正则表达式 - (?<date>$?(\d{4}-\d{2}-\d{2})?) - 代表一个命名的捕获组,其中 date 作为名称,$?(\d{4}-\d{2}-\d{2})? 作为模式。 $?(\d{4}-\d{2}-\d{2})? 模式匹配

  • $? - 可选 $ 字符
  • (\d{4}-\d{2}-\d{2})? - 可选 四位数序列,-,两位数,-,两位数。

由于模式没有锚定(不必匹配整个字符串)并且两个连续的模式部分都是可选的,因此可以匹配空字符串~r/(?<date>$?(\d{4}-\d{2}-\d{2})?)/ 正则表达式 **匹配 "My String 2021-01-01" 字符串开头的第一个空位置(空字符串)。

经验法则:如果您不想匹配空字符串,请确保您的模式包含 obligatory 模式,那必须匹配至少一个字符。