带有加法 (+) 和减法 (-) 数学运算符的单个数字或组的正则表达式

Regular expression for single number or groups with addition (+) and subtraction (-) mathematical operator

我需要创建一个只接受数字和加减字符的正则表达式。

我已经通过这种方式定义了单个数字和组模式 ([1-9][0-9]*)

我无法添加加减字符的定义。

我希望与此示例类似的东西一切正常

例如:12 + 1 - 23 - 9 + 10

为了实现验证,我建议您将其标记化,但通过首先查找运算符 [+-] 然后查找数字来组织它。标记化后,您可以在代码中验证所有操作是否有效,并且 累积 总和。

例子

var data = "12 + 1 - 23 - 9 + 10";

var pattern = @"(?<Operator>[+-]*)\s*(?<Number>\d+)";

var tokens =
   Regex.Matches(data, pattern)
        .OfType<Match>()
        .Select (mt => new
             {
                 Operator = string.IsNullOrEmpty(mt.Groups["Operator"].Value)
                                  ? "+"   // Default to '+' if not found. (First Number)
                                  : mt.Groups["Operator"].Value,
                 Value    = mt.Groups["Number"].Value
             });

要累积的结果

请注意,如果数字开始时为负数,例如 -12 + 1 - 23 - 9 + 10 结果:

,它也可以工作


坦率地说,可以添加负数。下面是一个模式来处理数字的符号并将符号和运算符一起处理以确定正负累加:

var data = "-12 + 1 + -2 - -3";

var pattern = @"(?<Operator>[+-]*)\s*(?<Sign>[-]*)\s*(?<Number>\d+)";

var tokens =
   Regex.Matches(data, pattern)
        .OfType<Match>()
         .Select (mt => new
                  {
                    Operator = string.IsNullOrEmpty(mt.Groups["Operator"].Value)
                                     ? 1   // default to + if not found (First Number)
                                     : mt.Groups["Operator"].Value == "-" ? 0 : 1,
                    Sign     = string.IsNullOrEmpty(mt.Groups["Sign"].Value)
                                     ? 1   // default to positive
                                     : 0,
                    Value    = mt.Groups["Number"].Value
                  })
         .Select (token => new
              {
                  Postive = (((token.Operator & token.Sign) > 0) || 
                             ((token.Operator + token.Sign) == 0)) 
                             ? "+" : "-",
                  Value = token.Value
               })

要累积的结果

注意 累积 时减去 -3 使其成为 +3。 ;-)


为了完整起见,这里是第一个 Select 的快照,然后第二个 Select 的运算符和符号确定完成:

这表明两个零表示两个减号,需要转换为加号。