正则表达式错误地分割:用逗号但不在方括号内(两者都是 ) 和 ] )

2023-12-23

正则表达式的想法:用逗号分隔,后面不跟任何字符 and ) 或 ]。 此外,两个括号都应该被考虑(和[。假设:字符串包含有效的括号。

这是我的功能:

function spl(str) {
    var reg = /\,(?!(?:[\w|\s]*\,?)*[\)\]])/;  
    console.log(str.split(reg));
}

问题:

incorrectly: spl("tpr(7,4%), nitrita sals (sals- 1.2%, konservants E250)");
incorrectly: spl("tpr(7,4%), nitri(a,b,c[a,b])ta sals (sals- 1.2%, konservants E250),fsfs");
incorrectly: if there are brackets within brackets

以下是示例:

 str = "a,b (c,d,e)";
// expected: split into strings "a", "b (c,d,e)"

 str = "a,b [c,d,e]";
 // expected: split into strings "a", "b [c,d,e]"    

 str = "tpr(7,4%), nitrita sals (sals- 1.2%, konservants E250)";
 // expected split into "tpr(7,4%)", "nitrita sals (sals- 1.2%, konservants E250)"

 str = "tpr(7,4%), nitri(a,b,c[a,b])ta sals (sals- 1.2%, konservants E250),fsfs";
 //expected: "tpr(7,4%)", "nitri(a,b,c[a,b])ta sals (sals- 1.2%, konservants E250)" and "fsfs"

  str = "šokolāde 47% (cukurs, kakao sviests, (SOJAS); vanilīns), pulv";
  // expected: splited into two strings; "šokolāde 47% (cukurs, kakao sviests, (SOJAS); vanilīns)" and "pulv"

您可以使用否定先行断言,如以下正则表达式所示:

/,\s*(?![^()]*\)|[^\]\[]*\])/

正则表达式演示 https://regex101.com/r/ygXJLY/3

  • \s*,\s*: 匹配两边有 0 个或多个空格包围的逗号
  • (?![^()]*\)|[^\]\[]*\]): 是一个否定的前瞻表达式,断言我们没有)前面跟随 0 个或多个非圆括号字符或者没有]前面跟随 0 个或多个非方括号字符。

PS:请注意,此正则表达式解决方案仅适用于非嵌套和未转义的括号。为了处理相同类型的嵌套括号,请使用解析器代码如下。

var arr = ['a,b (c,d,e)', 'a,b [c,d,e]',
'tpr(7,4%), nitrita sals (sals- 1.2%, konservants E250)',
'tpr(7,4%), nitri(a,b,c[a,b])ta sals (sals- 1.2%, konservants E250),fsfs',
'šokolāde 47% (cukurs, kakao sviests, (SOJAS); vanilīns), pulv'];

for (var j=0, arrlen=arr.length; j < arrlen; j++)
  console.log("*** Pocessing:", arr[j], "=>", splitComma(arr[j]));

function splitComma(str) {
  var result = [];
  var lvl = {'rb':0, 'sb':0};
  var tmp = '';
  var cd = 0;
  
  for (var i = 0, len = str.length; i < len; i++) {
    var ch = str.charAt(i);
    
    if (ch == '(')
      lvl['rb']++;
    else if (ch == '[')
      lvl['sb']++;

    if (lvl['rb'] + lvl['sb'] == 0 && ch == ',') {
      result.push(tmp.trim());
      tmp = '';
    }
    else
      tmp += ch;
      
    if (ch == ')')
      lvl['rb']--;
    else if (ch == ']')
      lvl['sb']--;
  }      
  result.push(tmp.trim());
  return(result);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则表达式错误地分割:用逗号但不在方括号内(两者都是 ) 和 ] ) 的相关文章

随机推荐