【问题标题】:find matches for positive and negative number in arithmetic expression在算术表达式中查找正数和负数的匹配项
【发布时间】:2016-05-28 20:02:39
【问题描述】:

给定以下算术表达式: -1-5+(-3+2)

需要找到正数和负数的匹配项。对于该表达式,预期结果是:-1 5 -3 2

我尝试使用正则表达式 -?\d+(.\d+)?但它返回:-1 -5 -3 2 其中 -5 不正确。

是否可以构建正则表达式模式来获取该案例和其他类似案例的正数和负数?

【问题讨论】:

  • 您使用什么语言/工具?如果支持,后向操作可能会导致 solution
  • 你必须定义(对自己和正则表达式)为什么 -1 是正确的但 -5 是不正确的。
  • 你可以使用(^|\D)([-]?\d*\.?\d+)(在JS中),或者(?<!\d)[-]?\d*\.?\d+(如果它是一个更好的正则表达式引擎)。
  • (?
  • @Alex,我发布了我的建议并添加了解释。

标签: regex


【解决方案1】:

你可以使用

(?<!\d)[-]?\d*\.?\d+

regex demo

模式详情

  • (?&lt;!\d) - 如果数字出现在当前测试位置之前,则匹配失败
  • [-]? - 可选的(1 或 0)减号
  • \d* - 0+ 位
  • \.? - 1 或 0 个点(转义后的文字点)
  • \d+ - 1 位以上

请注意,\d*\.?\d+ 允许使用 .456 值,如果不需要,请使用 \d+(?:\.\d+)?

如果不支持后视,请使用交替捕获组来检查 - 是否不在字符串的开头或其他数字之前:

(?:^|\D)([-]?\d*\.?\d+)

参见another demo(必要的值在第 1 组中)。

【讨论】:

    【解决方案2】:

    /((?:^|\+|-|\()(-?\d+))/

    你没有说你正在使用什么语言/脚本,但这里有一个 PHP 示例:

    $string = '-1-5+(-3+2)';
    preg_match_all('/(?:^|\+|-)(-?\d+)/', $string, $matches);
    print_r($matches[1]);
    

    输出:

    Array
    (
        [0] => -1
        [1] => 5
        [2] => -3
        [3] => 2
    )
    

    PHP Sandbox

    解释:有两种分组模式:

    /
      (?:^|\+|-|\()
      (-?\d+)
    /
    

    第一个组是一个非捕获组?:,并且是一个交替,即匹配列表中的任何字符。该列表中有 4 个字符:

    ^ 行开始

    \+字面加号

    -减号

    \( 文字打开括号

    第一组可以使第二组中的可选- 脱颖而出。每个数字(正数或负数)前面都会有第一组中列出的一个字符,现在匹配后面的所有字符,包括 -(如果存在)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 2017-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多