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' ]
我有两个可能的字符串需要匹配:
+/-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' ]