匹配逗号分隔列表中的项目,这些项目不包含单引号或双引号

时间:2016-03-14 14:13:01

标签: javascript regex

我想要在逗号分隔的列表中匹配任何文本实例。为此,以下正则表达式非常有用:

/[^,]+/g

Regex101 demo)。

问题在于我想忽略任何包含在单引号或双引号内的逗号,而且我不确定如何扩展上面的选择器以允许我这样做。

这是一个示例字符串:

abcd, efgh, ij"k,l", mnop, 'q,rs't

我想要匹配五个文本块匹配四个相关逗号(因此我可以使用split()代替match()来检索数据):

  1. abcd
  2. efgh
  3. ij"k,l"
  4. mnop
  5. 'q,rs't
  6. 或者:

    abcd, efgh, ij"k,l", mnop, 'q,rs't
        ^     ^        ^     ^
    

    我该怎么做?

    存在三个相关问题,但它们都不适用于JavaScript中的'"

    1. Regex for splitting a string using space when not surrounded by single or double quotes - Java解决方案,似乎不适用于JavaScript。
    2. A regex to match a comma that isn't surrounded by quotes - 仅限于"
    3. 上的匹配项
    4. Alternative to regex: match all instances not inside quotes - 仅限于"
    5. 上的匹配项

3 个答案:

答案 0 :(得分:3)

好的,所以您的匹配组可以包含:

  • 只是字母
  • 一对匹配的“
  • 一对匹配的'

所以这应该有效:

/((?:[^,"']+|"[^"]*"|'[^']*')+)/g

RegEx101 Demo

作为一个很好的奖励,您可以在双引号内删除额外的单引号,反之亦然。但是,您可能需要一个状态机来在双引号字符串中添加转义双引号(例如“aa \”aa“)。

不幸的是,它也匹配了初始空间 - 你必须修剪匹配。

答案 1 :(得分:2)

使用双前瞻来确定匹配的逗号是引号外:

/(?=(([^"]*"){2})*[^"]*$)(?=(([^']*'){2})*[^']*$)\s*,\s*/g
  • (?=(([^"]*"){2})*[^"]*$)断言在匹配逗号之前有双引号。
  • (?=(([^']*"){2})*[^']*$)对单引号做同样的断言。

PS:这不会处理不平衡,嵌套或转义引号的情况。

RegEx Demo

答案 2 :(得分:0)

在JavaScript中试用

(?:(?:[^,"'\n]*(?:(?:"[^"\n]*")|(?:'[^'\n]*'))[^,"'\n]*)+)|[^,\n]+

Demo

添加组以提高可读性(对于Javascript,请删除?< 名称>)

(?<has_quotes>(?:[^,"'\n]*(?:(?<double_quotes>"[^"\n]*")|(?<single_quotes>'[^'\n]*'))[^,"'\n]*)+)|(?<simple>[^,\n]+)

Demo

说明:

(?<double_quotes>"[^"\n]*")匹配"任何内部但不是&#34; " = (1)(双引号)
(?<single_quotes>'[^'\n]*')匹配'任何内部但不是' = (2)(单引号)
(?:(?<double_quotes>"[^"\n]*")|(?<single_quotes>'[^'\n]*'))匹配(1)或(2)= (3)
[^,"'\n]*匹配任何文字,但不匹配"', = (w)
(?:(?:(?<double_quotes>"[^"\n]*")|(?<single_quotes>'[^'\n]*'))[^,"'\n]*)匹配(3)(w)
(?:(?:(?<double_quotes>"[^"\n]*")|(?<single_quotes>'[^'\n]*'))[^,"'\n]*)+匹配重复(3)(w)= (3w +)
(?<has_quotes>[^,"'\n]*(?:(?:(?<double_quotes>"[^"\n]*")|(?<single_quotes>'[^'\n]*'))[^,"'\n]*)+)匹配(w)(3w +)= (4)(有引号)
[^,\n]+与其他案例匹配(5)(简单)
所以在最后我们有(4)|(5)(有引用或简单)

输入

abcd,efgh, ijkl
abcd, efgh, ij"k,l", mnop, 'q,rs't
'q, rs't
"'q,rs't, ij"k, l""

输出:

MATCH 1
simple  [0-4]   `abcd`
MATCH 2
simple  [5-9]   `efgh`
MATCH 3
simple  [10-15] ` ijkl`
MATCH 4
simple  [16-20] `abcd`
MATCH 5
simple  [21-26] ` efgh`
MATCH 6
has_quotes  [27-35] ` ij"k,l"`
double_quotes   [30-35] `"k,l"`
MATCH 7
simple  [36-41] ` mnop`
MATCH 8
has_quotes  [42-50] ` 'q,rs't`
single_quotes   [43-49] `'q,rs'`
MATCH 9
has_quotes  [51-59] `'q, rs't`
single_quotes   [51-58] `'q, rs'`
MATCH 10
has_quotes  [60-74] `"'q,rs't, ij"k`
double_quotes   [60-73] `"'q,rs't, ij"`
MATCH 11
has_quotes  [75-79] ` l""`
double_quotes   [77-79] `""`