智能正则表达式来理解输入

时间:2016-09-13 18:55:25

标签: javascript html regex string io

关注Split string that used to be a list,我这样做:

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"]

2 个答案:

答案 0 :(得分:2)

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

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

请参阅regex demo

详细

  • \((-?\d+), (-?\d+)\) - 一个(,一个数字(捕获到第1组),一个,,空格,另一个数字(捕获到第2组)和一个{{1 }}
  • ) - 或
  • | - \((-?\d+)\),然后是数字(捕获到第3组)和(

)

答案 1 :(得分:2)

简单来说,您可以使用.replace(/(\d+)\s*,\s*/g, '$1')合并/连接数字对,然后使用您已经使用的简单正则表达式匹配。

示例:

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作为我们匹配的数字的后向引用,从而删除数字后的空格和逗号。