我想取一个字符串,如“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"}
2条答案
按热度按时间shyt4zoc1#
你想
您的正则表达式
(?<date>\$?(\d{4}-\d{2}-\d{2})?)
表示一个命名捕获组,名称为date
,模式为\$?(\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"
字符串开头的第一个空位置(空字符串)。clj7thdc2#
仅浸提日期:
这将输出:1/19/2023
浸提日期和时间:
这将输出:2023年1月19日上午9:29:11