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

lg40wkob  于 2023-01-21  发布在  其他
关注(0)|答案(2)|浏览(127)

我想取一个字符串,如“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"}
shyt4zoc

shyt4zoc1#

你想

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})?-一个可选的四位数序列,-,两位数,-,两位数。

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

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

clj7thdc2#

仅浸提日期:

void main() {

String inputString = "Your String 1/19/2023 9:29:11 AM";
  RegExp dateRegex = new RegExp(r"(\d{1,2}\/\d{1,2}\/\d{4})");
  Iterable<RegExpMatch> matches = dateRegex.allMatches(inputString);
  for (RegExpMatch m in matches) {
    print(m.group(0));
  }
}

这将输出:1/19/2023
浸提日期和时间:

void main() {

String inputString = "Your String 1/19/2023 9:29:11 AM";
  RegExp dateTimeRegex = new RegExp(r"(\d{1,2}\/\d{1,2}\/\d{4} \d{1,2}:\d{2}:\d{2} [AP]M)");
  Iterable<RegExpMatch> matches = dateTimeRegex.allMatches(inputString);
  for (RegExpMatch m in matches) {
    print(m.group(0));
  }
}

这将输出:2023年1月19日上午9:29:11

相关问题