当前位置: 首页 > 知识库问答 >
问题:

如何在Dart中匹配连续日期的序列,如字符串?

阮阳曦
2023-03-14

我有像20210215和14032020这样的连续日期字符,我正在尝试将其转换为像2021.02.15和14.03.2020这样的日期字符串

我的第一个问题是连续的字符,它是2格式类型。喜欢:

1) 20210215
2) 14032020

我的第二个问题是在不更改格式的情况下将它们转换为日期字符串。比如:

1) 2021.02.15
2) 14.03.2020

当我搜索about regex时,找不到任何模式来将上面的{20210215}连续字符示例转换为date {2021.02.15}字符串。

正如我在Dart中所描述的,转换两种格式的正确正则表达式模式是什么?

UPDATE-1:

我需要将此字符串“20210215”转换为此“2021.02.15”作为字符串而不是DateTime。我还需要将此字符串“14032020”转换为此字符串“14.03.2020”。我不想转到DateTime字符串。

更新2:这是我能找到的最好的,但是它把02天或月变成了2天。但是我需要它。

  var timestampString = '13022020';//'20200213';

  var re1 = RegExp(
    r'^'
    r'(?<year>\d{4})'
    r'(?<month>\d{2})'
    r'(?<day>\d{2})'
    r'$',
  );

  var re2 = RegExp(
    r'^'
    r'(?<day>\d{2})'
    r'(?<month>\d{2})'
    r'(?<year>\d{4})'
    r'$',
  );

  var dateTime;
  var match1 = re1.firstMatch(timestampString);
  if (match1 == null) {
    var match2 = re2.firstMatch(timestampString);
    if (match2 == null) {
      //throw FormatException('Unrecognized timestamp format');
      dateTime = '00.00.0000';
      print('DATE_TIME: $dateTime');
    } else {
      var _day = int.parse(match2.namedGroup('day'));
      var _month = int.parse(match2.namedGroup('month'));
      var _year = int.parse(match2.namedGroup('year'));
      dateTime = '$_day.$_month.$_year';
      print('DATE_TIME(match2): $dateTime');
    }
  } else {
    var _year = int.parse(match1.namedGroup('year'));
    var _month = int.parse(match1.namedGroup('month'));
    var _day = int.parse(match1.namedGroup('day'));
    dateTime = '$_year.$_month.$_day';
    print('DATE_TIME(match1): $dateTime');
  }

输出:

DATE_TIME: 2020.2.13

但是我需要得到2020.02.13的输出。

其次是 match1 也打印 1302.20.20 但是如果我删除 var match2 部分,如果格式像20200213它的工作原理,但不会打印 0,因为我在上面发布它。

共有1个答案

韦宏扬
2023-03-14

你可以用

text.replaceAllMapped(RegExp(r'\b(?:((?:19|20)\d{2})(0?[1-9]|1[0-2])(0?[1-9]|[12][0-9]|3[01])|(0?[1-9]|[12][0-9]|3[01])(0?[1-9]|1[0-2])((?:19|20)\d{2}))\b'), (Match m) => m[4] == null ? "${m[1]}.${m[2]}.${m[3]}" : "${m[4]}.${m[5]}.${m[6]}")

\b(?:((?:19|20)\d{2})(0?[1-9]|1[0-2])(0?[1-9]|[12][0-9]|3[01])|(0?[1-9]|[12][0-9]|3[01])(0?[1-9]|1[0-2])((?:19|20)\d{2})\b 正则表达式匹配

  • \b - 单词边界
  • (?: - 非捕获组的开始:
    • ((?:19|20)\d{2}) - 20世纪和21世纪的年份
    • (0?[1-9]|1[0-2]) - 月
    • (0?[1-9]|[12][0-9]|3[01]) - 天
    • (0?[1-9]|[12][0-9]|3[01])-天
    • (0?[1-9]|1[0-2])-月
    • ((?: 19|20)\d{2})-年

    请参阅正则表达式演示。

    观看Dart演示:

    
    void main() {
      final text = '13022020 and 20200213 20111919';
      print(text.replaceAllMapped(RegExp(r'\b(?:((?:19|20)\d{2})(0?[1-9]|1[0-2])(0?[1-9]|[12][0-9]|3[01])|(0?[1-9]|[12][0-9]|3[01])(0?[1-9]|1[0-2])((?:19|20)\d{2}))\b'), (Match m) => 
       m[4] == null ? "${m[1]}.${m[2]}.${m[3]}" : "${m[4]}.${m[5]}.${m[6]}"));
    } 
    

    返回< code>13.02.2020和2020.02.13 20.11.1919。

    如果组4为空,则第一个备选项匹配,因此我们需要使用组1、2和3。否则,我们用一个点将组4、5和6连接起来。

 类似资料:
  • 我有连续的类似货币的字符串序列,如: 我想使用正则表达式来覆盖连续的钱的序列,如字符串到钱类型或在Dart双精度像: 连续货币类字符的输入序列字符串长度为15。 我只是尝试学习正则表达式,并尝试使用: 但它潜入字符串,不添加。在空白空间中: 如我在Dart中所述,转换上述格式的正确正则表达式模式是什么?

  • 问题内容: 有没有检查连续日期的功能。我在处理以下问题时遇到问题: 我的表有一个包含以下数据的列: 给定的开始日期为,结束日期为。我想要的结果是: 有人可以建议什么吗? 问题答案: 我认为这是 “连续日期分组岛” 问题的一种变体。可以使用以下方法完成: SQL小提琴 结果 这是SQL Server 2005版本: SQL小提琴

  • 我正在尝试开发一个正则表达式,它将拒绝所提供的日期格式中的非连续字符。我希望尽可能灵活,所以我决定我的日期格式字符串可以包含YY或YYYY,MM或MMM,DD或DDD,hh mm和ss。 我已经计算出的一些正则表达式-例如,匹配以下内容将显示月份是3个字符的格式: 我完全不知道日期格式是否包含非连续字符。例如,以下日期格式应有效: 但是这些格式应该被拒绝 为了将来的扩展,我想允许非连续的特殊字符

  • 我在API文档中看到上有一个方法,但我不清楚参数需要什么。目前的需要是一个非常简单的直接向上的阿尔法比较。

  • 问题内容: 假设我有这个清单。如何按“日期”(字典中的一项)排序。但是,“日期”是一个字符串… 问题答案:

  • 问题内容: 我试图写一个函数来识别日期组,并测量组的大小。 到目前为止,我一直在使用Python进行此过程,但我想将其移入SQL。 例如清单 应该输出到新表中,如下所示: 理想情况下,这还应该能够解决周末和公共假日的问题- 我表中的日期应该是周一至周五(我想我可以通过制作一个新的工作日表并按顺序编号来解决此问题)。有人建议我尝试CTE。我对此很陌生,因此,我感谢任何人都可以提供的任何指导!谢谢。