2011-03-24 111 views
2

我希望允许用户输入数字,小数点前最多3位数字,小数点后有可选小数点,最多可输入2位数字。文本输入的正则表达式

我希望它匹配:12,123,123.5,123.55,123 我不希望它匹配:ABC,1234,123.555

我有什么到目前为止它: ^ \ d { 0,3}(。?)\ d {0,2} $

目前它仍然匹配1234.我想我需要使用后面的运算符以某种方式,但我不知道如何。

感谢

回答

3

试试这个:

^\d{0,3}(?:\.\d{0,2})?$ 

或者更好,以避免仅仅.

^(?:\d{1,3}(?:\.\d{0,2})?|\.\d{1,2})$ 

特别要注意:

  • 避灾点,或它匹配任何字符(除了新行),包括更多的数字。
  • 使整个小数部分可选,包括点。即 - 小数点是而不是可选 - 如果要匹配小数部分中的任何数字,则必须包含小数点。
  • 即使您已经转义了点,^\d{0,3}(\.?)\d{0,2}$也不正确。使用点可选,它可以匹配12378\d{0,3}匹配123,(\.?)不匹配任何内容,并且\d{0,2}匹配78

工作例如:http://rubular.com/r/OOw6Ucgdgq

+0

+1优秀的作品! – alex 2011-03-24 05:45:41

+0

这两个工作都很好,但我可能会使用第一个,因为它更容易阅读!是什么 ?:运营商在做什么 – 2011-03-24 05:56:04

+0

@Ciaran - 谢谢。 '(?:)'被设计为什么都不做 - 它是一个[非捕获组](http://stackoverflow.com/questions/3512471/non-capturing-group) - 一个逻辑组,但它的匹配不是' t被添加到正则表达式的结果中。 – Kobi 2011-03-24 06:01:43

0

你必须把小数点和小数可选的组合。在你的正则表达式中,只有十进制数是可选的。 1234被接受,因为123满足^ \ d {0,3},不存在小数点满足(。?),并且4满足\ d {0,2}。

Kobi的回答为您提供了正确的正则表达式。

1

也许这(未经测试)

^(?=.*\d)\d{0,3}\.?(?<=\.)\d{0,2}$

编辑 - 上面是错误的。

@Kobi的回答是正确的。

可以在他的第一个版本中添加一个lookahead,以确保NOT不仅仅是一个点或空字符串。

^(?=.*\d)\d{0,3}(?:\.\d{0,2})?$

+0

不是。 '\。?(?<= \。)'读取“可选点,然后检查您是否在一个点之后”,这在逻辑上与'\ .'相同。一个条件可能在这里工作,但我怀疑它太多了,并没有得到普遍支持。即使没有'(?<= \。)','(?=。* \ d)'也能保护'.',但它仍然可以匹配'12345'。 – Kobi 2011-03-24 05:54:07

+0

哦,我错过了可选的点。好的赶上! – sln 2011-03-24 06:04:35

+0

@Kobi,“抵御'。”,但仍然可以匹配'12345'“?你是如何得出这个结论的? '(?=。* \ d)'保证至少有一位数字。 '\。?'是可选的,'(?<= \。)'实际上保护后面的数字,'(?:)'组绑定可选的'.digits'。你应该仔细阅读。 – sln 2011-03-24 06:35:04

1

这是怎么回事?

/^\d{0,2}(?:\d\.|\.\d|\d\.\d)?\d?$/