为了账号安全,请及时绑定邮箱和手机立即绑定

在引号之外选择逗号的Regex

在引号之外选择逗号的Regex

芜湖不芜 2019-06-17 17:36:07
我不太确定这是否可能,所以我求助于你。我想找一个正则表达式,将挑选所有逗号以外的引号集。例如:'foo' => 'bar','foofoo' => 'bar,bar'这将在第1行之后选择单个逗号。'bar',我不关心单引号还是双引号。有人有什么想法吗?我觉得这是有可能的,但我的判断力太弱了。在引号之外选择逗号的Regex
查看完整描述

3 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

下面的regexes将匹配在双引号之外的所有逗号,

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

演示

(仅限PCRE)

"[^"]*"(*SKIP)(*F)|,

"[^"]*"匹配所有双引号块。也就是说,在这个buz,"bar,foo"输入,此正则表达式将匹配"bar,foo"只有。下面是(*SKIP)(*F)使比赛失败。然后,它移动到旁边的模式|符号,并尝试匹配剩余字符串中的字符。也就是说,在我们的产出中,模式旁边|将只匹配后面的逗号。buz..注意,这与双引号中的逗号不匹配,因为我们已经将双引号部分跳过了。

演示


下面的regex将匹配双引号中的所有逗号,

,(?!(?:[^"]*"[^"]*")*[^"]*$)

演示


查看完整回答
反对 回复 2019-06-17
?
紫衣仙女

TA贡献1839条经验 获得超15个赞

虽然可以使用regex(我和下一个人一样喜欢滥用regexes)来破解它,但您迟早会遇到麻烦,尝试在没有更高级解析器的情况下处理子字符串。陷入困境的可能方法包括混合引号和转义引号。

此函数将在逗号上拆分一个字符串,但不是在单引号或双引号内的逗号。它可以很容易地用额外的字符作为引号进行扩展(虽然像“这样的字符对还需要几行代码),甚至可以告诉您,如果您忘记关闭数据中的引号:

function splitNotStrings(str){
  var parse=[], inString=false, escape=0, end=0

  for(var i=0, c; c=str[i]; i++){ // looping over the characters in str
    if(c==='\\'){ escape^=1; continue} // 1 when odd number of consecutive \
    if(c===','){
      if(!inString){
        parse.push(str.slice(end, i))
        end=i+1
      }
    }
    else if(splitNotStrings.quotes.indexOf(c)>-1 && !escape){
      if(c===inString) inString=false
      else if(!inString) inString=c    }
    escape=0
  }
  // now we finished parsing, strings should be closed
  if(inString) throw SyntaxError('expected matching '+inString)
  if(end<i) parse.push(str.slice(end, i))
  return parse}splitNotStrings.quotes="'\"" // add other (symmetrical) quotes here


查看完整回答
反对 回复 2019-06-17
  • 3 回答
  • 0 关注
  • 627 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信