【问题标题】:Extract date from string using Regex.named_capture使用 Regex.named_capture 从字符串中提取日期
【发布时间】:2022-01-07 22:30:36
【问题描述】:

我想将“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 elixir


    【解决方案1】:

    你想要

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

    您的正则表达式 - (?&lt;date&gt;\$?(\d{4}-\d{2}-\d{2})?) - 表示以 date 作为名称和 \$?(\d{4}-\d{2}-\d{2})? 作为模式的命名捕获组。 \$?(\d{4}-\d{2}-\d{2})? 模式匹配

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

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

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

    【讨论】:

    • 非常感谢!我刚刚意识到可选的 $ char 一开始就不应该在那里,而是从我正在处理的另一个正则表达式中复制/粘贴。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 2020-08-14
    • 2016-06-24
    • 1970-01-01
    相关资源
    最近更新 更多