用逗号分割字符串,不在引号或括号内

时间:2021-03-15 13:08:52

标签: javascript regex split regex-lookarounds

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

我正在尝试使用未嵌套在 ""''[]() 中的逗号分割(CSS 选择器)字符串(使用正则表达式)。

我成功地做到了这一点,但只使用了其中一个符号 [""''()],但没有将它们全部放在一起。例如,我使用以下正则表达式作为引号:

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

用逗号下的标记来分隔部分的输入示例:

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

这应该拆分为:

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

可以吗?

1 个答案:

答案 0 :(得分:0)

如果括号未嵌套,则可以使用以下内容:

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):这些都捕获了引用部分,无论是双引号还是单引号。第一个用于独立引号,第二个用于方括号内的引号,第三个用于括号内的引号。 \\. 处理转义下一个字符的反斜杠。

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

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

相关问题