首页 > 解决方案 > 组合前瞻不匹配

问题描述

我正在使用以下测试字符串:

__level__:,Undergraduate,;__subject__:,Maths,Art,;

这实际上是一个字符串化对象{ level: ["Undergraduate"], subject: ["Maths", "Art"] },我认为将其转换为字符串并使用正则表达式可能比遍历每个级别|主题和这些属性中的每个值更快。

我可以匹配属性列表(例如级别)中的单个值,如下所示:

(?=(__subject__:[^;]*(,Maths,).*?;))

我可以像这样匹配两个:

(?=(__subject__:[^;]*(,Maths,).*?;))(?=(__subject__:[^;]*(,Art,).*?;))

但是,我不能保证级别和主题列表的顺序。以下也是可能的:

__subject__:,Maths,Art,;__level__:,Undergraduate,;

请注意,我现在已将主题放在级别之前。现在正则表达式不匹配。我对未来很陌生,所以我无法弄清楚我做错了什么。将不胜感激有关此事的任何帮助。

我还想组合要匹配的属性,例如:

(?=(__level__:[^;]*(,Undergraduate,).*?;))(?=(__subject__:[^;]*(,Maths,).*?;))(?=(__subject__:[^;]*(,Art,).*?;))

..对我也不起作用,但我正在尝试匹配来自主题属性的两个值和来自级别属性的值。同样,我不能保证属性(例如级别、主题)和/或值(例如数学、艺术或艺术、数学)的顺序

标签: regex

解决方案


\[A-Z\]积极的前瞻(?=)

目标是字母[A-Z]+?,要排除下划线包围的单词,请使用正向前瞻来确保目标后跟逗号(?=,)

/([A-Z]+?)(?=,)/gi;

演示

let str = `__level__:,Undergraduate,;__subject__:,Maths,Art,;`;
let rgx = /([A-Z]+?)(?=,)/gi;
let mch = rgx.exec(str);
let res = [];
while (mch !== null) {
  res.push(mch[0]);
  mch = rgx.exec(str);
}
console.log(res.join(', '));


推荐阅读