繁体   English   中英

匹配字符串中一个模式但排除另一个模式的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+)))$

您必须使用的唯一限制是,在第二种输入类型中,正数应该放在第一位。

你会得到在匹配组matches[1]如果输入是1型的,并且在matches[2]如果它是类型2。对于类型2输入的,每个数字的进一步匹配被存储在matches[3]matches[4]

您可以在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' ]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM