我想让人们以各种格式输入文本框。其中一种格式是:
2h
2小时,或
2.5h
2个半小时
我想使用正则表达式识别模式,但由于某种原因它没有采用它:
我有:
var hourRegex = /^\d{1,2}[\.\d+]?[h|H]$/;
适用于2h
,但不适用于2.5h
。
我认为这个正则表达式意味着 - 从字符串的开头开始,有一个或两个数字,然后没有或一个小数点,如果存在,必须后跟一个或多个数字,然后有一个{{1}或者h
然后它必须是字符串的结尾。
我尝试过正则表达式工具here,但没有运气。
答案 0 :(得分:5)
/^\d{1,2}(?:\.\d+)?h$/i;
请使用括号而不是方括号。
h
[...]
- 方括号表示:在提供的范围内的任何内容。[^...]
表示:匹配不在提供范围内的字符(...)
- 圆括号表示:对我进行分组。 (可选)组的第一个字符可以从以下开始:
?:
- 不要引用我(我,我=群组) ?=
- 不要让我参加比赛,不过我必须在这里?!
- 此时我可能不会出现{a,b}
,{a,}
表示:至少 a
,最多 b
个字符。省略b
= Infinity +
表示:至少一次,尽可能匹配 equivalen to {1,}
*
表示:尽可能匹配相当于{0,}
+?
和*?
与之前描述的效果相同,但有一点不同:匹配尽可能少[a-z] One character, any character between a, b, c, ..., z
(a-z) Match "a-z", and group it
[^0-9] Match any non-number character
答案 1 :(得分:1)
问题在于:
[\.\d+]
你不能在括号内使用字符类。
请改用:
(\.[0-9]+)?
答案 2 :(得分:1)
您的方括号与括号混淆了。方括号查找任何包含字符的单个匹配,而括号查找整个封闭模式的匹配。
您的问题在于 [\.\d+]?
它正在寻找.
或0-9
或+
。
相反,你应该尝试:
/^\d{1,2}(\.\d+)?(h|H)$/
虽然这仍然允许用户输入无效的数字,例如99.3
,这可能不是预期的行为。