给出以下算术表达式: -1-5 +( - 3 + 2)
需要找到正数和负数的匹配项。对于该表达式,预期结果为:-1 5 -3 2
我尝试使用正则表达式 - ?\ d +(。\ d +)?但它返回:-1 -5 -3 2其中-5不正确。
是否可以构建正则表达式模式以获得该案例和其他类似案例的正数和负数?
答案 0 :(得分:1)
您可以使用
(?<!\d)[-]?\d*\.?\d+
请参阅regex demo
模式详情:
(?<!\d)
- 如果在当前测试位置之前出现一个数字,则会导致匹配失败的负面背后隐藏[-]?
- 可选的(1或0)减号\d*
- 0+位数\.?
- 1或0点(转义时的字面点)\d+
- 1+位数请注意\d*\.?\d+
允许.456
值,如果您不需要,请使用\d+(?:\.\d+)?
。
如果不支持lookbehind,请使用带有替换的捕获组来检查-
是否不在字符串的开头或另一个数字之前:
(?:^|\D)([-]?\d*\.?\d+)
请参阅another demo(必要的值在第1组中)。
答案 1 :(得分:0)
/((?:^|\+|-|\()(-?\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
)
解释:有两种分组模式:
/
(?:^|\+|-|\()
(-?\d+)
/
第一组是非捕获组?:
,并且是一个替代,即匹配列表中的任何字符。该列表中有4个字符:
^
行开始
\+
字面加
-
减去
\(
字面意思打开paren
第一组是让第二组中的可选-
脱颖而出。每个数字(正数或负数)前面都会有第一组中列出的其中一个字符,现在匹配后面的所有字符,包括-
(如果存在)。