在Javascript

时间:2015-07-10 15:03:34

标签: javascript regex string split

我试图通过空格和双引号(“)在Javascript中拆分字符串,但是有一个特殊条件:只有当第一个字符串前面有空格/字符串开头且第二个字符串后跟空格或两个引号时,两个引号才匹配字符串的结尾。

一些例子:

  • "a "b cd"变为['a "b cd']
  • "a b" cd"变为['a b', 'cd"']
  • "a "b" "x"" cd"变为['a "b', 'x"', 'cd"']

请注意,不遵守上述条件的引号仍保留在相应的原子中。

我有一个正则表达式,它按空格和分组引号分开,但我不能完全找出符合我所说的那个。

/(?:[^\s"]+|"[^"]*")+/g将引号2分为2,但这并不好。

2 个答案:

答案 0 :(得分:0)

我相信这应该符合您的要求: -

  

((^ | “*(\ W?| $)” \ S))

答案 1 :(得分:0)

这是一个或多或少的手动解决方案:



function split(s){
  var s = ' '+s+' ';
  var OUT = 0, IN = 1;
  var chunk = "";
  var results = [];
  var state = OUT;
  var length = s.length;

  for(var i=0; i<length; ++i){
    if(state === OUT){
      if(s[i]===' ' && s[i+1] === '"'){
        i++; state = IN; chunk="";  continue;
      }else {
        chunk+=s[i];
      }
    }else if(state === IN ){
      if(s[i]==='"' &&  s[i+1] === ' '){
        i++; state = OUT; results.push(chunk); chunk="";
        if(s[i+1] === '"'){
          i++; state = IN; continue;
        }
      }else {
        chunk+=s[i];
      }
    }
  }
  chunk.replace(/ $/,'');
  if(chunk.length !== 0){
    results.push(chunk);
  }
  return results;
}

['"a "b cd"', '"a b" cd"', '"a "b" "x"" cd"'].forEach(function(s){
  var result = s + ' => ' + "[ '" +split(s).join("', '") + "' ]" + '</br>\n';
  document.write(result);
 });
&#13;
&#13;
&#13;

(对于inspect javascript数组,可能有一种更好的方法,而不是我使用join方法做的那些。)