文本输入的正则表达式
问题描述:
我希望允许用户输入数字,小数点前最多3位数字,小数点后有可选小数点,最多可输入2位数字。文本输入的正则表达式
我希望它匹配:12,123,123.5,123.55,123 我不希望它匹配:ABC,1234,123.555
我有什么到目前为止它: ^ \ d { 0,3}(。?)\ d {0,2} $
目前它仍然匹配1234.我想我需要使用后面的运算符以某种方式,但我不知道如何。
感谢
答
试试这个:
^\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
。
答
你必须把小数点和小数可选的组合。在你的正则表达式中,只有十进制数是可选的。 1234被接受,因为123满足^ \ d {0,3},不存在小数点满足(。?),并且4满足\ d {0,2}。
Kobi的回答为您提供了正确的正则表达式。
答
也许这(未经测试)
^(?=.*\d)\d{0,3}\.?(?<=\.)\d{0,2}$
编辑 - 上面是错误的。
@Kobi的回答是正确的。
可以在他的第一个版本中添加一个lookahead,以确保NOT不仅仅是一个点或空字符串。
^(?=.*\d)\d{0,3}(?:\.\d{0,2})?$
答
这是怎么回事?
/^\d{0,2}(?:\d\.|\.\d|\d\.\d)?\d?$/
+1优秀的作品! – alex 2011-03-24 05:45:41
这两个工作都很好,但我可能会使用第一个,因为它更容易阅读!是什么 ?:运营商在做什么 – 2011-03-24 05:56:04
@Ciaran - 谢谢。 '(?:)'被设计为什么都不做 - 它是一个[非捕获组](http://stackoverflow.com/questions/3512471/non-capturing-group) - 一个逻辑组,但它的匹配不是' t被添加到正则表达式的结果中。 – Kobi 2011-03-24 06:01:43