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,).*?;))
..对我也不起作用,但我正在尝试匹配来自主题属性的两个值和来自级别属性的值。同样,我不能保证属性(例如级别、主题)和/或值(例如数学、艺术或艺术、数学)的顺序
解决方案
类\[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(', '));
推荐阅读
- python - 管道在kedro中找不到节点
- spring - Spring Boot JPA - 查找给定位置范围(lat,lng)和半径(距离)内的位置
- javascript - 在创建新对象时没有传递任何值时如何使用默认参数?
- c# - Moq - 具有匿名类型表达式的设置方法
- ios - Xcode 11 实时预览在真实设备上立即崩溃
- javascript - React-redux 没有触发异步功能
- css - 删除 Vaadin 14 只读文本字段的虚线边框
- regex - 两个可能的有效字符串的逗号分隔列表的正则表达式
- python - Python - 美丽的汤。为什么我的抓取循环不起作用?
- c++ - 为什么模数运算符不适用于该代码?