Javascript 匹配字符串中的一个模式但排除另一个模式的正则表达式

Javascript regex that matches one pattern in string but exclude another

我有两个可能的字符串需要匹配:

+/-90000

+9000 / -80000

我需要分别识别这两种模式,因此为此编写了一些正则表达式。我可以这样匹配的第一个单个数字字符串:

/\+\/\-{1}/g

我第二次写了这个:

/(\+(?=[0-9]+){1}|\-(?=[0-9]+){1}|\/(?=\s){1})/g

第二个也将部分匹配第一个第一个数字,即 -90000。有没有办法改进它们,使它们完全匹配?

您可以使用单个表达式:

^(?:(\+\/-\s*\d+)|((\+\s*\d+)\s*\/\s*(-\s*\d+)))$

您必须处理的唯一限制是在第二种输入中,正数应该排在第一位。

如果输入是类型 1,您将在 matches[1] 中获得匹配的组,如果输入是类型 2,则在 matches[2] 中。对于类型 2 输入,进一步匹配每个数字都存储在 matches[3]matches[4].

您可以看到 demo on regex101.

这里有两个语义略有不同的解决方案。

对于第一个,如果字符串是类型 1,则数字将在捕获组 1 (result[1]) 中,如果是类型 2,则数字将在捕获组 2 和 3(以及捕获组 1)中将是 null)。那么,类型 1 的测试是 result[1] !== null.

var a = '+/-90000';
var b = '+9000 / -80000';
var result;

var expr1 = /\+(?:\/-(\d+)|(\d+) \/ -(\d+))/;
result = a.match(expr1);
// => [ '+/-90000', '90000', null, null ]
result = b.match(expr1);
// => [ '+9000 / -80000', null, '9000', '80000' ]

对于第二个,如果字符串是类型 1,则数字将在捕获组 1 中(捕获组 2 将是 null),如果它是类型 2,则数字将在捕获组 2 中和 3. 类型 1 的测试是 result[1] === null.

var expr2 = /\+(\d+ )?\/ ?-(\d+)/;
result = a.match(expr2);
// => [ '+/-90000', null, '90000' ]
result = b.match(expr2);
// => [ '+9000 / -80000', '9000', '80000' ]