【问题标题】:Split string by comma not inside quotes or brackets用逗号分割字符串,不在引号或括号内
【发布时间】:2021-06-12 18:10:21
【问题描述】:

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

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

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

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

在逗号下带有标记的输入示例:

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

这应该拆分为:

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

有可能吗?

【问题讨论】:

  • 我最初的方法是[...input.matchAll(/(\(.*?\)|\[.*?\]|[^,])+/g)].map(m => m[0]) 不过不确定引号。引号可以在 CSS 选择器中转义,从而使事情变得更加复杂。

标签: javascript regex split regex-lookarounds


【解决方案1】:

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

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):它们都捕获了一个带引号的部分,用双引号或单引号。第一个用于独立引号,第二个用于方括号内的引号,第三个用于括号内的引号。 \\. 负责处理转义下一个字符的反斜杠。

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

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

【讨论】:

    猜你喜欢
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2020-04-26
    • 2020-04-05
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多