正则表达式的奇怪行为

时间:2017-10-17 11:14:19

标签: regex

背景: 我需要识别一对用连字符( - )分隔的数字,这些数字可以选择包括+/-并且可以是十进制数。 以下是这方面的例子:

3-4, +3-+4, .3-.4, 0.3-0.4, -0.3--0.4, 0.3--0.4 etc...

我使用的是以下表达式:

(-?\+?\d*.?\d*)-(-?\+?\d*.?\d*)

在大多数情况下效果很好但在下面失败了:

-0.3--0.4

它形成的群组是:-0.3-0.4

但如果我更换它像: (-?\+?\d*.?\d+)-(-?\+?\d*.?\d+),它运作正常。

我想知道用*取代+会有什么不同?

我们在javascript中使用过它。

1 个答案:

答案 0 :(得分:1)

错误的捕获是由于捕获组内的模式(-?\+?\d*.?\d*)可以匹配空字符串这一事实 - 更重要的是在这里 - .匹配任何char,不仅仅是一个点。您必须将其转义以匹配文字点。请注意(-?\+?\d*.?\d*)-(-?\+?\d*.?\d*)3-4,匹配的方式(使用第2组模式,捕获.)并注意匹配5和6,其中.匹配空格和连字符

此外,您的-?\+?实际上允许匹配-+符号序列,这似乎不是您需要的。只需使用[-+]?可选字符类。

所以,您可能希望使用([-+]?\d*\.?\d*)-([-+]?\d*\.?\d*)模式,但我建议您确保至少匹配1位数字,并且可以使用([-+]?\d*\.?\d+)-([-+]?\d*\.?\d+)模式。

详细说明:

  • ([-+]?\d*\.?\d+) - 第1组:一系列
    • [-+]? - 可选的-+
    • \d* - 0+位数
    • \.? - 可选的.
    • \d+ / \d* - 一位或多位数(或*为0或更多)
  • - - 连字符
  • ([-+]?\d*\.?\d+) - 见上文。