Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何基于逗号(括号内除外)拆分字符串_Javascript_Regex_String - Fatal编程技术网

Javascript 如何基于逗号(括号内除外)拆分字符串

Javascript 如何基于逗号(括号内除外)拆分字符串,javascript,regex,string,Javascript,Regex,String,我有一个字符串,其中包含一个create查询,我正在尝试根据逗号拆分它。不幸的是,有些行中有逗号,并用括号括起来 例如: dbo.Display_Test1.Column, CASE WHEN CHARINDEX(' To ', Test3) > 0 AND CHARINDEX('XVR', Test3) = 0 THEN LEFT(Test3, (CHARINDEX(' To ', Test3) - 12)) ELSE Test3 END AS Test3, dbo.Display_T

我有一个字符串,其中包含一个create查询,我正在尝试根据逗号拆分它。不幸的是,有些行中有逗号,并用括号括起来

例如:

dbo.Display_Test1.Column,
CASE WHEN CHARINDEX(' To ', Test3) > 0 AND CHARINDEX('XVR', Test3)  = 0 THEN LEFT(Test3, (CHARINDEX(' To ', Test3) - 12)) ELSE Test3 END AS Test3,
dbo.Display_Test2.Column,
ISNULL((CASE WHEN [2-Display-Test4].[Total Number] > 0 AND  [1-Display-Test5].SumOfNumber = 0 THEN 0 ELSE (([2-Display-Test4].[Total Number] * 1000) / [1-Display-Test5].SumOfNumber)  END), 0) AS Test6,
我想根据不在(可能是多个)括号内的逗号分割字符串。作为参考,我的示例应该在换行符所在的位置拆分(尽管我的字符串中没有换行符)

我尝试了许多不同的解决方案,但没有一个是完全正确的:

/(?:\(*[^()]*\)\[^,]+/g
在第1、3和4行工作,但在第2行失败。它将该行拆分为多个匹配项

/((?:[^,(]+|(\(?:[^()]+)|$1\))+)/g
适用于第1、2和3行,但在第4行失败。它还将该行拆分为多个匹配项

我似乎不能让它工作。任何帮助都是非常感谢的。

一个可能的解决方案:(注意:我们删除了分离comas)

var str=“dbo.Display_Test1.Column,当CHARINDEX('To',Test3)>0和CHARINDEX('XVR',Test3)=0,然后向左(Test3,(CHARINDEX('To',Test3)-12))否则Test3结束为Test3,dbo.Display_Test2.Column,为null([2-Display-Test4].[Total Number]>0和[1-Display-Test5]时的情况)。SumOfNumber=0,然后为0([2-Display-Test4]。[总数]*1000)/[1-Display-Test5].SumOfNumber)结束),0)作为Test6“;
//如果字符串没有以昏迷结尾,我们就添加它。
var strArr=str.replace(/,*\s*$/,',')。split(“”);
var-res;
res=strArr.reduce(函数(trans,charValue){
如果(charValue==='('){
trans.deep++;
}
如果(charValue==')'){
跨深;
}
如果(trans.deep==0){
如果(字符值===','){
反方向推力(反方向推力);
trans.str='';
}否则{
trans.str+=charValue;
}
}否则{
trans.str+=charValue;
}
返回反式;
},{arr:[],str:'',deep:0});

document.write(''+JSON.stringify(res.arr,null,'')+'');
当然,如果我们想要使用无限的括号嵌套,那么就不可能避免循环。对于某些有界嵌套,我们仍然可以编写捕获它的正则表达式

对于最多1个括号级别,它可以是

/((?:[^(),]|\((?:[^()]|\([^()]*\))*\))+)/g
最多2个括号级别(可能是您的情况)


以此类推,用
(?:[^()].\([^()]*\)*
正则表达式递归地替换
[^()]*
将无法满足您的需要,并且仍然允许任意复杂度

一种方法是遍历字符串中的每个字符,跟踪何时使用开括号和闭括号,并且只有当开括号和闭括号的数量相互抵消时才使用逗号进行拆分(因此您知道自己不在括号内)

函数拆分查询(输入){
var-arr=[];
var lastStart=0;
var开放=0;
对于(变量i=0,len=input.length;i
请注意,在处理特别大的字符串时,这种方法可能会很昂贵(从性能角度来看)

下面是一个工作示例:

var query=“dbo.Display_Test1.Column,当CHARINDEX('To',Test3)>0和CHARINDEX('XVR',Test3)=0时的情况,然后向左(Test3,(CHARINDEX('To',Test3)-12))否则Test3结束为Test3,dbo.Display_Test2.Column,为null([2-Display-Test4].[Total Number]>0和[1-Display-Test5]时的情况)。SumOfNumber=0,然后为0([2-Display-Test4]。[总数]*1000)/[1-Display-Test5].SumOfNumber)结束),0)作为Test6“;
var split=splitQuery(查询);
var output=document.getElementById(“输出”)
对于(拆分中的变量el){
output.insertAdjacentHTML(“beforeend”,el+”:“+split[el]+”
”; } 函数拆分查询(输入){ var-arr=[]; var lastStart=0; var开放=0; 对于(变量i=0,len=input.length;i

。为什么您要在查询形成后分割查询(毕竟,您想要的信息在形成查询之前没有奇怪的字符串分割)呢?您想提取什么信息?javascript正则表达式不可能。请发布一个清晰的输入/输出示例。例如:“我有这个”和“我需要这个”,那个“可能是多个”"括号使您的语言变得不规则,无法用正则表达式进行解析。只需使用适当的解析器即可。@Mike'Pomax'Kamermans这是一个非常狭窄的用例,我所能做的就是继续查询。不值得解释完整的问题。这只会增加混乱和混乱。方法不错!但是,
看起来像布尔值,请参见ms不必要;重要的是由
deep
测量的深度。这种方法也不处理输入字符串不以逗号结尾的情况(在这种情况下,它会去掉最后一个元素)。@Thriggle是的,当然!查找只用于我的测试目的,并且忘记/懒得删除它。**(已经晚了)**关于最后一个逗号,我不明白你的意思,如果字符串以一个逗号结束,请按原样使用它,在开始之前添加它。我刚才回答了你提出的问题,我只是想引导你找到一种方法,我知道我无法为你的所有用例提供解决方案。:-)
/((?:[^(),]|\((?:[^()]|\([^()]*\))*\))+)/g
function splitQuery(input){
  var arr = [];
  var lastStart = 0;
  var open = 0;
  for(var i = 0, len = input.length; i < len; i++){
    var curr = input[i];
    if(curr === "("){open += 1;}
    else if(curr === ")"){ open = open < 1 ? 0 :open -=1;}
    else if(curr === ","){
      if(open === 0){
        arr.push(input.substring(lastStart,i));
        lastStart = i+1;
      }
    }else if(i+1 === len){
       arr.push(input.substring(lastStart,i+1));
    }
  }
  return arr;
}