我需要匹配两个可能的字符串:
+/- 90000
和
+9000 / -80000
我需要分别识别这两种模式,所以为此写了一些正则表达式。我可以匹配的第一个单个数字字符串:
/\+\/\-{1}/g
我为第二个写了这个:
/(\+(?=[0-9]+){1}|\-(?=[0-9]+){1}|\/(?=\s){1})/g
第二个也将部分匹配第一个数字,即-90000。有没有办法可以改进它们以便它们完全匹配?
答案 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' ]