背景: 我需要识别一对用连字符( - )分隔的数字,这些数字可以选择包括+/-并且可以是十进制数。 以下是这方面的例子:
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中使用过它。
答案 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+)
- 见上文。