【问题标题】:Javascript regex that matches one pattern in string but exclude another匹配字符串中的一种模式但排除另一种模式的 Javascript 正则表达式
【发布时间】:2015-10-26 05:48:16
【问题描述】:

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

+/-90000

+9000 / -80000

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

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

这是我第二次写的:

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

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

【问题讨论】:

  • 我正在尝试匹配以确定用户输入系统的字符串类型。他们可以输入到同一个控件中,但我需要为每个控件执行不同的验证和工作流程。

标签: javascript regex exec match


【解决方案1】:

您可以使用单个表达式:

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

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

如果输入类型为 1,您将在 matches[1] 中获得匹配组,如果输入类型为 2,您将在 matches[2] 中获得匹配组。对于类型 2 输入,每个数字的进一步匹配存储在 @ 987654325@和matches[4]

你可以看到demo on regex101

【讨论】:

    【解决方案2】:

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

    对于第一个,如果字符串是类型 1,数字将在捕获组 1 (result[1]) 中,如果是类型 2,数字将在捕获组 2 和 3 中(捕获组 1 将是 @987654322 @)。那么,类型 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' ]
    

    【讨论】:

      猜你喜欢
      • 2014-09-05
      • 2011-12-21
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 2023-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多