javascript - 用逗号分割字符串,不在引号或括号内
问题描述
我对正则表达式非常熟悉,但发现以下问题难以解决。
我正在尝试用未嵌套在""
、''
或.[]
()
我成功地做到了这一点,但只使用了其中一个符号 [""
或] ''
,()
而不是所有符号一起使用。例如,我使用以下正则表达式作为引号:
(,)(?=(?:[^"]|"[^"]*")*$)
逗号下带有标记的输入示例应分隔各部分:
#id.class:contains("text with ,") , #id2[attr="value,"]:contains(,) , [attr='value,']
^ ^
这应该拆分为:
#id.class:contains("text with ,")
#id2[attr="value,"]:contains(,)
[attr='value,']
那有可能吗?
解决方案
如果括号没有嵌套,那么您可以使用以下内容:
let s = `#id.class:contains("text with ,") , #id2[attr="value,"]:contains(,) , [attr='value,']`;
let regex = /(?:(["'])(\\.|(?!\1)[^\\])*\1|\[(?:(["'])(\\.|(?!\2)[^\\])*\2|[^\]])*\]|\((?:(["'])(\\.|(?!\3)[^\\])*\3|[^)])*\)|[^,])+/g;
let parts = s.match(regex);
for (let part of parts) console.log(part);
打破它
表达式分为四个部分,由|
(OR) 分割:
(["'])(\\.|(?!\1)[^\\])*\1
\[(?:(["'])(\\.|(?!\2)[^\\])*\2|[^\]])*\]
\((?:(["'])(\\.|(?!\3)[^\\])*\3|[^)])*\)
[^,]
前三个有(["'])(\\.|(?!\1)[^\\])*\1
(但分别带有\2
和\3
):它们都捕获引用的部分,用双引号或单引号。第一个用于独立引号,第二个用于方括号内的引号,第三个用于括号内的引号。\\.
负责转义下一个字符的反斜杠。
第四种选择是包罗万象的:对于任何不在引号或括号中出现的非特殊字符。这不应该是逗号,因为那是分隔符。
这四个选项是可重复的,因此包装(?: ...... )+
推荐阅读
- localhost - Hybris - 从 java 类启动服务器
- android - 如何解决这些调试错误找不到局部变量额外
- java - 如何为 Spring Boot 应用程序编写 Junit 测试用例?
- sql - 在具有大量变量的 Oracle 中使用 LIKE
- excel - 将许多 Excel 数据表连接到 Access 查询
- google-apps-script - Google Apps 脚本可以处理 GET 查询字符串并发布到 Google 表格吗?
- android - 如何在汉堡菜单中添加返回图标?
- android - SMS 广播接收器仅在收到新 SMS 时进行烘烤
- ionic-framework - 如何使用 ionic-v4 在 ion-fab-button 中添加动态背景颜色?
- ubuntu - 使用 PhpStorm 在项目中查找要更改的指定文本