带有负面外观的十进制或整数

时间:2016-06-04 09:53:20

标签: c# regex

我有以下简单的负面看法

(?<![Ø]\s*)

以下表达式匹配整数或小数,无论是否包含整数部分

([0-9]*(?:[.,][0-9]+)?)     

第二个表达式匹配8 8.8 8,8 .8 ,88 etc..

我试图将两个表达式结合起来忽略第二个表达式的整个匹配,以防它前面有Ø,所以我做了

(?<![Ø]\s*)([0-9]*(?:[.,][0-9]+)?)

和那些测试值

88.88
88,88
,88
.5
Ø    .8
Ø  8.8

前4个值按预期匹配,但最后2个的一部分得到部分匹配,我预计它根本不匹配,有人可以告诉我缺少什么吗?

2 个答案:

答案 0 :(得分:4)

你可以试试这个

(?<![Ø]\s*|[.,\d])(?=[\d.,]{1,})([0-9]*(?:[.,][0-9]+)?)
             ^^
             ||

<强> regexstorm demo

bobble bubble

建议的更简单的版本
(?<!Ø\s*|[.,\d])(\d*[.,]?\d+)

答案 1 :(得分:4)

总是更好地解释SO的答案。所以我们走了:问题是表达式实际上可以匹配字符串中的。因此,如果测试用例在匹配中有多个字符可能会失败,那么匹配将启动一个字符并匹配其余字符。更加如此,因为给定的表达式可以匹配某些字符空白字符串。做事的最佳方式是:

  1. 添加支票以确保匹配至少包含一位数字,
  2. 添加支票以确保它位于潜在匹配的开头。
  3. 这两个都可以用负面的背后隐藏来完成。因此:(?<!Ø\s*[.,\d]*)\d*[.,]?\d+