JavaScript RegEx匹配(部分)小时

时间:2011-10-09 18:05:13

标签: javascript regex

我想让人们以各种格式输入文本框。其中一种格式是:

2h 2小时,或
2.5h 2个半小时

我想使用正则表达式识别模式,但由于某种原因它没有采用它:

我有:

var hourRegex = /^\d{1,2}[\.\d+]?[h|H]$/;

适用于2h,但不适用于2.5h

我认为这个正则表达式意味着 - 从字符串的开头开始,有一个或两个数字,然后没有或一个小数点,如果存在,必须后跟一个或多个数字,然后有一个{{1}或者h然后它必须是字符串的结尾。

我尝试过正则表达式工具here,但没有运气。

3 个答案:

答案 0 :(得分:5)

/^\d{1,2}(?:\.\d+)?h$/i;请使用括号而不是方括号。

  • 从头开始
  • 一位或两位数
  • 可选:一个点后跟至少一位数
  • h
  • 结尾
  • 不区分大小写

RegExp tuturial

  • [...] - 方括号表示:在提供的范围内的任何内容。
  • [^...]表示:匹配不在提供范围内的字符
  • (...) - 圆括号表示:对我进行分组。 (可选)组的第一个字符可以从以下开始:
    1. ?: - 不要引用我(我,我=群组)
    2. ?= - 不要让我参加比赛,不过我必须在这里
    3. ?! - 此时我可能不会出现

  • {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,这可能不是预期的行为。