组合前瞻不匹配

时间:2019-02-06 23:51:05

标签: regex

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

__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,).*?;))

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

1 个答案:

答案 0 :(得分:0)

Class \[A-Z\]Positive Lookahead (?=)

目标是字母[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(', '));