正则表达式不适用于JavaScript

时间:2012-03-19 20:05:26

标签: javascript regex

我正在努力确保人们输入的格式正是这样:

.match(/\d{1,2}:\d\d\s((AM)|(PM))/)

意味着用户可以写:

12:30 AM
2:30 PM

但不是:

1:2 A
1:30
PM

它必须是前两位数,后跟冒号,而不是两位数,一个空格,以及AM或PM。但我的正则表达式不是那样的。我错过了什么?

7 个答案:

答案 0 :(得分:6)

究竟是什么问题?

> "1:2 A".match(/\d{1,2}:\d\d\s((AM)|(PM))/);
null

>"12:30 AM".match(/\d{1,2}:\d\d\s((AM)|(PM))/);
["12:30 AM", "AM", "AM", undefined]

然而:

  1. 您需要将表达式置于字符串的开头(^)和结尾($);否则

    > "foo 12:30 AM foo".match(/\d{1,2}:\d\d\s((AM)|(PM))/);
    ["12:30 AM", "AM", "AM", undefined]
    
  2. 请改为RegExp.test(),它会返回一个更简单的true / false而非数组。

    > /^\d{1,2}:\d\d\s((AM)|(PM))$/.test("12:30 AM");
    true
    
  3. 执行相同操作的简单表达式可以是/^\d{1,2}:\d{2} [AP]M$/

答案 1 :(得分:4)

假设您在单行输入字段上检查它(而不是在文本区域内搜索),您应该这样做:

/^\d{1,2}:\d\d\s[AP]M$/

答案 2 :(得分:3)

这样的事情怎么样:

.match(/([0]?[1-9]|1[0-2])(:)[0-5][0-9]?( )?(AM|PM)/)

答案 3 :(得分:1)

如果您的问题是新行字符。 你可以尝试:

'12:30 
AM'.replace(/\n/, '').match(/\d{1,2}:\d\d\s((AM)|(PM))/)

答案 4 :(得分:1)

我已经在http://www.regular-expressions.info/javascriptexample.html中尝试了您的代码,但它确实有效。

顺便说一句,您还需要测试时间是否有效。你的代码现在可以接受像上午99:12这样的事情,好像它们是正确的。我建议你使用这样的东西。

\b(1[0-2]|\d):[0-5][0-9]\s([aApP][mM])\b

=)

答案 5 :(得分:1)

结合Matt,c0deNinja和我自己的想法,你应该最终得到:

/^(0?[1-9]|1[0-2]):[0-5][0-9]\s?[AP]M$/.test(input);

答案 6 :(得分:1)

你的正则表达式似乎是正确的。结合上面的一些想法,你可以用Regex测试你的字符串:

^(1[0-2]|\d):[0-5]\d [aApP][mM]$

Javascript中的测试代码:

var regex = /^(1[0-2]|\d):[0-5]\d [aApP][mM]$/g; 
    var input = "2:30 PM"; 
    if(regex.test(input)) {
      var matches = input.match(regex);
      for(var match in matches) {
        alert(matches[match]);
      } 
    } else {
      alert("No matches found!");
    }