我对正则表达式非常熟悉,但发现以下问题难以解决。
我正在尝试使用未嵌套在 ""
、''
、[]
或 ()
中的逗号分割(CSS 选择器)字符串(使用正则表达式)。
我成功地做到了这一点,但只使用了其中一个符号 [""
或 ''
或 ()
],但没有将它们全部放在一起。例如,我使用以下正则表达式作为引号:
(,)(?=(?:[^"]|"[^"]*")*$)
用逗号下的标记来分隔部分的输入示例:
#id.class:contains("text with ,") , #id2[attr="value,"]:contains(,) , [attr='value,']
^ ^
这应该拆分为:
#id.class:contains("text with ,")
#id2[attr="value,"]:contains(,)
[attr='value,']
可以吗?
答案 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
\[(?:(["'])(\\.|(?!\2)[^\\])*\2|[^\]])*\]
\((?:(["'])(\\.|(?!\3)[^\\])*\3|[^)])*\)
[^,]
前三个有 (["'])(\\.|(?!\1)[^\\])*\1
(但分别有 \2
和 \3
):这些都捕获了引用部分,无论是双引号还是单引号。第一个用于独立引号,第二个用于方括号内的引号,第三个用于括号内的引号。 \\.
处理转义下一个字符的反斜杠。
第四种选择是包罗万象的:用于不出现在引号或括号中的任何非特殊字符。这不应该是逗号,因为它是分隔符。
这四个选项是可重复的,因此包装 (?: ...... )+