首页 > 解决方案 > 如何使两个不同的正则表达式合二为一?

问题描述

我搜索以匹配特定键的日期,但目前我成功匹配所有日期,或匹配我的特定键但不与日期分开。

这是一个更直观的解释

在输入我有

Mystring ="
Text("List1:[2000-00-00 00:00, 2020-09-02 04:30, 2020-09-03 00:30, 2020-09-03 02:30, 2020-09-03 04:30, 2020-09-03 07:25, 2020-09-03 10:00, 2020-09-03 10:02],
Text("List2:[2000-00-00 00:00, 2020-09-02 04:30, 2020-09-03 00:30, 2020-09-03 02:30, 2020-09-03 04:30, 2020-09-03 07:25, 2020-09-03 10:00, 2020-09-03 10:02]
"

使用此功能,我匹配 Mystring 的所有日期

 RegExp regExp79 = new RegExp(r'\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}');
 mylistdate = regExp79.allMatches(Mystring).map((z) => z.group(0));
 print(mylistdate);

但输出需要所有日期(list1 和 List2)我尝试只匹配 list1

所以我尝试进行字符限制。例如,如果我只想要 list1 中的日期,我尝试匹配 Text("List1:[. 和]

所有这些正则表达式单独工作,但没有找到如何一起工作

Text\("list1:\[    => start limitation
    
(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}) => extraction of date 

(.*?)] => end of limitation 

但是如果我把它全部融化,它就不起作用,它只选择第一个日期,我会匹配有限选择的所有日期

Text\("List1:\[(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}).*?]    

https://regex101.com/r/6adb1u/1

标签: regexflutter

解决方案


您可以使用

(?<=Text\("List1:\[[^\][]*?)\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}(?=[^\][]*])

查看正则表达式演示

细节

  • (?<=Text\("List1:\[[^\][]*?)- 一个积极的向后看,需要Text("List1:[紧接着当前位置左侧的除方括号之外的任何 0 个或多个字符(尽可能少)
  • \d{4}-\d{2}-\d{2}\s\d{2}:\d{2}- 4 位, -, 2 位, -, 2 位, 空格, 2 位, :2 位
  • (?=[^\][]*])- 一个正向前瞻,需要除方括号外的任何 0 个或更多字符(尽可能多),紧跟]当前位置右侧的字符。

代码示例:

String Mystring ="\nText(\"List1:[2000-00-00 00:00, 2020-09-02 04:30, 2020-09-03 00:30, 2020-09-03 02:30, 2020-09-03 04:30, 2020-09-03 07:25, 2020-09-03 10:00, 2020-09-03 10:02],\nText(\"List2:[2000-00-00 00:00, 2020-09-02 04:30, 2020-09-03 00:30, 2020-09-03 02:30, 2020-09-03 04:30, 2020-09-03 07:25, 2020-09-03 10:00, 2020-09-03 10:02]";
RegExp regExp79 = new RegExp(r'(?<=Text\("List1:\[[^\][]*?)\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}(?=[^\][]*])');
print(regExp79.allMatches(Mystring).map((z) => z.group(0)).toList());

输出:

[2000-00-00 00:00, 2020-09-02 04:30, 2020-09-03 00:30, 2020-09-03 02:30, 2020-09-03 04:30, 2020-09-03 07:25, 2020-09-03 10:00, 2020-09-03 10:02]

推荐阅读