正则表达式将字符串之间的字符串捕获到js中的数组中

Regex to capture string between string into array in js

如果我们有以下字符串:

"hukhkhk\nClosing Date: Friday 22nd April 2022\nwdwqdwqdwqd\nClosing Date: Friday 22nd April 2023\newdewfewf"

我们想从中获取 2 个日期 "Friday 22nd April 2022""Friday 22nd April 2023"

如何使用 js 获取所有捕获字符串的数组。

[ "Friday 22nd April 2022", "Friday 22nd April 2023" ]

我的正则表达式中存在问题,但不确定如何修复它以使其不匹配它找到的第一个 \n 之间的所有内容:

(?<=Closing Date:\s)(.*)(?=\n)

https://regexr.com/6k2uf

我试过的js是这样的:

var reg = new RegExp('(?<=Closing Date: )(.*)(?=\n)/g');
reg.exec("hukhkhk\nClosing Date: Friday 22nd April 2022\nwdwqdwqdwqd\nClosing Date: Friday 22nd April 2023\newdewfewf")

(?<=Closing Date: )(.*?)(?=\n)

Closing Date: 之后开始匹配(包括space)

在遇到第一个\n之前停止匹配

这适用于您的示例

live example

示例数据的另一种方法,以及任何具有所需文本易于定义标记的数据,将 split 将数据放入行数组(在 \n 处标记) ,将数组 filter 应用于数组以删除不包含标记字符串的元素,最后 .map 数组仅包含标记字符串后面的所需部分。

进程可以串在一行中,如以下代码片段所示:

string = "hukhkhk\nClosing Date: Friday 22nd April 2022\nwdwqdwqdwqd\nClosing Date: Friday 22nd April 2023\newdewfewf";

markerString = "Closing Date: ";

datesArray = string.split('\n').filter(text => text.indexOf(markerString) > -1).map(text => text.slice(text.indexOf(markerString)+ markerString.length));

console.log(datesArray)

编辑:

  1. 我不得不删除 group names(未使用并在运行时产生重大影响)
  2. 作为 split()
  3. 的结果过滤空字符串(@input 边)
const input = "hukhkhk\nClosing Date: Friday 22nd April 2022\nwdwqdwqdwqd\nClosing Date: Friday 22nd April 2023\newdewfewf";
const regex = /(?:(?:\n|^).*?(?:\n|$))(?:Closing\sDate:\s)?/mg
const dates = input.split(regex).filter(date => date.length > 0);
console.log(dates);

输出:

[ 'Friday 22nd April 2022', 'Friday 22nd April 2023' ]

第一个回答:

使用regex查找所有non-date内容:

const re = /(?<junk>(?:\n|^).*?(?:\n|$))(?<delimiter>Closing Date: )?/gm

然后使用 JS split 获取仅包含日期的数组

const dates = input.split(re);