混淆正则表达式重复部分
Confusing with Regular Expressions repeaing parts
我真的很困惑正则表达式重复部分与花括号。考虑下面的例子:
var dateTime = /'d{1,2}'/'d{1,2}'/'d{4} 'd{1,2}:'d{2}/;
console.log(dateTime.test("30/1/2003 8:45"));
// true
现在如果我将30改为300000,将45改为455555,我将再次得到true !外部数之间的其他部分没有问题,结果与预期一致。
谁能帮我找出问题所在吗?谢谢。
你没有匹配字符串 (^
和$
)的开始和结束,所以它只是在字符串的任何地方找到匹配,这仍然发生,然后给出true。
300000/1/2003 8:455555
dd/m/yyyy h:mm
你可能想要
/^'d{1,2}'/'d{1,2}'/'d{4} 'd{1,2}:'d{2}$/;
或者更确切地说;
/^(?:0?[1-9]|[12]'d|3[01])'/(?:0?[1-9]|1[0-2])'/'d{4} (?:0?'d|1'd|2[0-3]):[0-5]'d$/;
-
(?:pattern)
非捕获组 -
pattern?
pattern
中的n
是可选的 -
[1-9]
字符类;1
~9
-
pattern1|pattern2
或pattern1
或pattern2
-
[12]
字符;1
或2
-
'd
与[0-9]
相同 -
pattern{4}
n
在pattern
中出现4
次
您没有匹配整个字符串,只是其中的一部分-使用test
函数,这足以返回True
。
试试这个:
/^'d{1,2}'/'d{1,2}'/'d{4} 'd{1,2}:'d{2}$/
^
锚匹配字符串的开头,$
锚匹配字符串的结尾。
您可以通过使用string.match(regex)
而不是regex.test(string)
找到更多关于匹配的有用信息。
在本例中,您将看到它匹配00/1/2003 8:45
,因为您没有使用^
和$
分别标记主题字符串的开始和结束。
发生的情况是,当您将30更改为30000时,将匹配30000的最后两个零(00),而对于45555,匹配将在前两个数字(45)停止,并且字符串的其余部分不匹配。
为了防止这种情况发生,您必须指出字符串必须以指定的regex开始和结束。
这可以使用anchors
来完成。
像这样-
var dateTime = /^'d{1,2}'/'d{1,2}'/'d{4} 'd{1,2}:'d{2}$/;
^ ^
相关文章:
- java.net和javascript之间正则表达式的差异
- Grunt匹配正则表达式
- 不同浏览器中的空白字符正则表达式行为
- 正则表达式在字符串中找到base64
- 子字符串/正则表达式以获取字符串中保存的 SRC 值
- 调用正则表达式匹配的函数
- 使用正则表达式评估电子邮件地址时出现性能问题
- Javascript 正则表达式 : ^[^/s/]+[a-z]{1,}[0-9]*[-_]*[^/][
- JavaScript正则表达式文本与RegExp对象
- 正则表达式只允许 x 个整数
- 使用正则表达式将输入格式设置为单字符逗号、单字符逗号等
- 改进用于验证付款金额的正则表达式
- 正则表达式与数字中的第二个点匹配
- 键按正则表达式以查找具有负值的小数
- 一个正则表达式,用于从JS中的HTML标记中删除id、样式和类属性
- 将po-box javascript正则表达式转换为c#regex
- 在mongoose中使用正则表达式在对象数组中进行查询搜索
- 使用正则表达式捕获“”并分割成阵列
- 将这些正则表达式从javascript转换为Java
- 用于验证JS中逻辑运算符表达式的正则表达式