正则表达式将字符串之间的字符串捕获到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)
我试过的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
之前停止匹配
这适用于您的示例
示例数据的另一种方法,以及任何具有所需文本易于定义标记的数据,将 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)
编辑:
- 我不得不删除
group names
(未使用并在运行时产生重大影响)
- 作为
split()
的结果过滤空字符串(@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);
如果我们有以下字符串:
"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)
我试过的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
之前停止匹配
这适用于您的示例
示例数据的另一种方法,以及任何具有所需文本易于定义标记的数据,将 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)
编辑:
- 我不得不删除
group names
(未使用并在运行时产生重大影响) - 作为
split()
的结果过滤空字符串(@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);