智能正则表达式理解输入

Intelligent regex to understand input

本文关键字:输入 正则表达式 智能      更新时间:2023-09-26

在过去是一个列表的分割字符串之后,我这样做:

console.log(lines[line]);
var regex = /(-?'d{1,})/g;
var cluster = lines[line].match(regex);
console.log(cluster);

它会给我这个:

((3158), (737))
["3158", "737"]

,其中3158稍后将作为我的程序中的ID, 737将作为相关数据。

我想知道是否有一种方法来处理这种输入:

((3158, 1024), (737))

,其中ID将是一对,并执行如下操作:

var single_regex = regex_for_single_ID;
var pair_regex = regex_for_pair_ID;
if(single_regex)
  // do my logic
else if(pair_regex)
  // do my other logic
else
  // bad input

这可能吗?


澄清:

我感兴趣的是区别对待这两种情况。例如,一种解决方案是有这样的行为:

((3158), (737))
["3158", "737"]

,对于对,连接ID:

((3158, 1024), (737))
["31581024", "737"]

对于一个简单的方法,您可以使用.replace(/('d+)'s*,'s*/g, '$1')来合并/连接成对的数字,然后使用您已经使用的简单regex匹配。

例子:

var v1 = "((3158), (737))"; // singular string
var v2 = "((3158, 1024), (737))"; // paired number string
var arr1 = v1.replace(/('d+)'s*,'s*/g, '$1').match(/-?'d+/g)
//=> ["3158", "737"]
var arr2 = v2.replace(/('d+)'s*,'s*/g, '$1').match(/-?'d+/g)
//=> ["31581024", "737"]

我们在.replace中使用这个正则表达式:

/('d+)'s*,'s*/
  • 匹配并分组1个或多个数字,后面跟着可选的空格和逗号。
  • 在替换中,我们使用$1,这是我们匹配的数字的后引用,从而删除了数字后面的空格和逗号。

您可以使用交替操作符匹配一对数字(将它们捕获到单独的捕获组中)或单个数字:

/'((-?'d+), (-?'d+)')|'((-?'d+)')/g

查看regex演示

细节

:

  • '((-?'d+), (-?'d+)') -一个(,一个数字(捕获到组1),一个,,空格,另一个数字对(捕获到组2)和一个)
  • | -或
  • '((-?'d+)') -一个(,然后一个数字(捕获到组3),和一个)

var re = /'((-?'d+), (-?'d+)')|'((-?'d+)')/g; 
var str = '((3158), (737)) ((3158, 1024), (737))';
var res = [];
while ((m = re.exec(str)) !== null) {
  if (m[3]) {
    res.push(m[3]);
  } else {
    res.push(m[1]+m[2]);
  }
}
console.log(res);