我不太确定这是否可行,所以我转向你.
我想找到一个正则表达式,它将挑选掉所有引号集之外的逗号.
例如:
'foo' => 'bar', 'foofoo' => 'bar,bar'
这将在第1行中选出单个逗号 'bar',
我真的不关心单引号和双引号.
有没有人有任何想法?我觉得这应该可以用readaheads,但我的正则表达式太弱了.
这将匹配任何字符串,包括第一个未引用的",".那是你想要的吗?
/^([^"]|"[^"]*")*?(,)/
如果你想要所有这些(并且作为反对那个说不可能的人的例子)你可以写:
/(,)(?=(?:[^"]|"[^"]*")*$)/
这将匹配所有这些.从而
'test, a "comma,", bob, ",sam,",here'.gsub(/(,)(?=(?:[^"]|"[^"]*")*$)/,';')
用分号替换不在引号内的所有逗号,并产生:
'test; a "comma,"; bob; ",sam,";here'
如果您需要它跨换行符,只需添加m(多行)标志.
以下正则表达式将匹配双引号外的所有逗号,
,(?=(?:[^"]*"[^"]*")*[^"]*$)
DEMO
或(仅限PCRE)
"[^"]*"(*SKIP)(*F)|,
"[^"]*"
匹配所有双引号块.也就是说,在此buz,"bar,foo"
输入中,此正则表达式"bar,foo"
仅匹配.现在,以下内容(*SKIP)(*F)
使匹配失败.然后它移动到|
符号旁边的模式,并尝试匹配剩余字符串中的字符.也就是说,在我们的,
模式旁边的输出|
中只匹配后面的逗号buz
.请注意,这与双引号内的逗号不匹配,因为我们已经使双引号部分跳过.
DEMO
以下正则表达式将匹配双引号内的所有逗号,
,(?!(?:[^"]*"[^"]*")*[^"]*$)
DEMO