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