我的正则表达式匹配整数有什么问题?

时间:2014-02-09 20:03:55

标签: c# regex .net-3.5

是的,我确定之前已经在StackOverflow上询问过这个问题,但是如果有的话请指点我,因为我找不到它。有很多正则表达式的问题,有些甚至与我想要的相似。

基本上,我想匹配整数(即整数),包括正数和负数。所以没有任何以小数点后跟更多数字的结尾。我只关心英文风格的编号,我不想让千分隔等等,而我只想用一个'。'作为小数点,这些奇怪的'逗号都不是某些国家的小数点'。

^[+-]?\d+(?!\.\d)

但上述情况似乎与以下相符......

10      matches '10'       <- yay
465654  matches '465654'   <- yay
653.56  only matches '65'  <- boo
1234.5  only matches '123' <- also boo!

regexper上尝试这一点,在视觉上看起来与我想要的完全一样。我是消极前瞻的新手,所以我显然在这里错过了一些东西,但是它是什么?

另外,我应该说我正在使用它作为我正在编写的解释器的一部分,因此我想在整数之后允许其他内容。 e.g。

12 + some_variable

或(更复杂)......

10.Tostring()  <- should still match the '10'

1 个答案:

答案 0 :(得分:4)

您的模式匹配任何数字序列,后面跟不是.和另一个数字。在1234.5中,子字符串123后面没有.(因为后跟4),所以它是有效匹配。

尝试使用结束锚($)以确保在匹配的字符串后不显示其他字符:

^[+-]?\d+$

如果您需要允许匹配字符串后面的字符,您可以尝试使用否定前瞻来确保匹配的子字符串后面没有. 数字:

^[+-]?\d+(?![\d.])

Demonstration


匹配10.ToString()之类的字符串,您也可以使用否定前瞻,如下所示:

^[+-]?\d+(?!\.?\d)

Demonstration

另一种策略是使用正面预测,如下所示:

^[+-]?\d+(?=\.\D|[^.\d]|$)

Demonstration