我想要在逗号分隔的列表中匹配任何文本实例。为此,以下正则表达式非常有用:
/[^,]+/g
问题在于我想忽略任何包含在单引号或双引号内的逗号,而且我不确定如何扩展上面的选择器以允许我这样做。
这是一个示例字符串:
abcd, efgh, ij"k,l", mnop, 'q,rs't
我想要匹配五个文本块或匹配四个相关逗号(因此我可以使用split()
代替match()
来检索数据):
abcd
efgh
ij"k,l"
mnop
'q,rs't
或者:
abcd, efgh, ij"k,l", mnop, 'q,rs't
^ ^ ^ ^
我该怎么做?
存在三个相关问题,但它们都不适用于JavaScript中的'
和"
:
"
"
答案 0 :(得分:3)
好的,所以您的匹配组可以包含:
所以这应该有效:
/((?:[^,"']+|"[^"]*"|'[^']*')+)/g
作为一个很好的奖励,您可以在双引号内删除额外的单引号,反之亦然。但是,您可能需要一个状态机来在双引号字符串中添加转义双引号(例如“aa \”aa“)。
不幸的是,它也匹配了初始空间 - 你必须修剪匹配。
答案 1 :(得分:2)
使用双前瞻来确定匹配的逗号是引号外:
/(?=(([^"]*"){2})*[^"]*$)(?=(([^']*'){2})*[^']*$)\s*,\s*/g
(?=(([^"]*"){2})*[^"]*$)
断言在匹配逗号之前有双引号。 (?=(([^']*"){2})*[^']*$)
对单引号做同样的断言。PS:这不会处理不平衡,嵌套或转义引号的情况。
答案 2 :(得分:0)
在JavaScript中试用
(?:(?:[^,"'\n]*(?:(?:"[^"\n]*")|(?:'[^'\n]*'))[^,"'\n]*)+)|[^,\n]+
添加组以提高可读性(对于Javascript,请删除?< 名称>)
(?<has_quotes>(?:[^,"'\n]*(?:(?<double_quotes>"[^"\n]*")|(?<single_quotes>'[^'\n]*'))[^,"'\n]*)+)|(?<simple>[^,\n]+)
说明:
(?<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] `""`