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

时间:2015-10-26 05:48:16

标签: javascript regex exec match

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

+/- 90000

+9000 / -80000

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

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

我为第二个写了这个:

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

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

2 个答案:

答案 0 :(得分:1)

您可以使用单个表达式:

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

您必须使用的唯一限制是,在第二种类型的输入中,正数应首先出现。

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

您可以看到demo on regex101

答案 1 :(得分:1)

以下是两种语义略有不同的解决方案。

对于第一个,如果字符串是类型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' ]