我正试图从一个长字符串中使用不同的模式提取多个字符串。我已经使用不同的Regex查询成功地做到了这一点,但我觉得这不是很有效。以下是输入字符串的示例:
常量输入=。。。。学生人数:5…[新]课间休息下午1点45分参与的学生有:约翰、约瑟夫、玛丽亚pm…剩余活动:跳远、洗牌。。
有三个前缀用于提取后面的数据:const prefix1 = Students involved are:
const prefix2 = Activities remaining:
const prefix3 = Number of students:
唯一的模式是在上面三个字符串中的每一个字符串后面都有一条换行符。示例:Students involved are: John, Joseph, Marian
我使用了以下正则表达式来实现这一点:
const students = input.match(new RegExp(prefix1 + "(.*)"));
const activities = input.match(new RegExp(prefix2 + "(.*)"));
const numOfStudents = input.match(new RegExp(prefix3 + "(.*)"));
有没有一种更好、更有效的方法来实现上面的内容,即我只需要迭代一次长字符串?
您可以将所有三个正则表达式组合为一个,如下所示:(?<=Number of students: )(?<number>[^n]+).*?(?<=Students involved are: )(?<students>[^n]+).*?(?<=Activities remaining: )(?<activities>[^n]+)/gms
然后,通过使用捕获组,您可以访问所需的所有三个值。
let s = `const input = ....Number of students: 5...
at 1:45 pm
Students involved are: John, Joseph, Maria
Lunch at 2:00 pm...Activities remaining: long jump, shuffle..`
let pattern = /(?<=Number of students: )(?<number>[^n]+).*?(?<=Students involved are: )(?<students>[^n]+).*?(?<=Activities remaining: )(?<activities>[^n]+)/gms
let m = pattern.exec(s)
console.log(m.groups.students)
console.log(m.groups.number)
console.log(m.groups.activities)
由于除了每一行后面的换行符之外没有其他模式,所以这将匹配到换行符之前的任何内容,因此您需要清理匹配的值。