首页 > 解决方案 > 用逗号分割字符串,不在引号或括号内

问题描述

我对正则表达式非常熟悉,但发现以下问题难以解决。

我正在尝试用未嵌套在""''或.[]()

我成功地做到了这一点,但只使用了其中一个符号 [""或] ''()而不是所有符号一起使用。例如,我使用以下正则表达式作为引号:

(,)(?=(?:[^"]|"[^"]*")*$)

逗号下带有标记的输入示例应分隔各部分:

#id.class:contains("text with ,") , #id2[attr="value,"]:contains(,) , [attr='value,']
                                  ^                                 ^

这应该拆分为:

那有可能吗?

标签: javascriptregexsplitregex-lookarounds

解决方案


如果括号没有嵌套,那么您可以使用以下内容:

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)[^\\])*\1
  2. \[(?:(["'])(\\.|(?!\2)[^\\])*\2|[^\]])*\]
  3. \((?:(["'])(\\.|(?!\3)[^\\])*\3|[^)])*\)
  4. [^,]

前三个有(["'])(\\.|(?!\1)[^\\])*\1(但分别带有\2\3):它们都捕获引用的部分,用双引号或单引号。第一个用于独立引号,第二个用于方括号内的引号,第三个用于括号内的引号。\\.负责转义下一个字符的反斜杠。

第四种选择是包罗万象的:对于任何不在引号或括号中出现的非特殊字符。这不应该是逗号,因为那是分隔符。

这四个选项是可重复的,因此包装(?: ...... )+


推荐阅读