Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么';这个正则表达式不是按我想要的方式工作吗?_Javascript_Regex - Fatal编程技术网

Javascript 为什么';这个正则表达式不是按我想要的方式工作吗?

Javascript 为什么';这个正则表达式不是按我想要的方式工作吗?,javascript,regex,Javascript,Regex,我试图让正则表达式在日期字符串中查找数字(例如,04/05/1989)。这就是我所拥有的: \A0[1-9]{2}\/0[1-9]{2}\/[1900-2012]\z这将不匹配有效的10/10/1989,但将匹配无效的099/0991989。首先,0[1-9]{2}匹配0加上1和9之间的两位数字。另外,[1900-2012]不是您想要的。我想这不会匹配有效的10/10/1989,但会匹配无效的099/0991989。首先,0[1-9]{2}匹配0加上1和9之间的两位数字。另外,[1900-201

我试图让正则表达式在日期字符串中查找数字(例如,04/05/1989)。这就是我所拥有的:


\A0[1-9]{2}\/0[1-9]{2}\/[1900-2012]\z

这将不匹配有效的
10/10/1989
,但将匹配无效的
099/0991989
。首先,
0[1-9]{2}
匹配
0
加上
1
9
之间的两位数字。另外,
[1900-2012]
不是您想要的。

我想这不会匹配有效的
10/10/1989
,但会匹配无效的
099/0991989
。首先,
0[1-9]{2}
匹配
0
加上
1
9
之间的两位数字。另外,
[1900-2012]
不是您想要的。

方括号创建的是字符范围,而不是数字范围:

  • [A-Z]
    匹配从
    A
    Z
    的所有ASCII字符
  • [1900-2012]
    匹配
    1
    9
    0
    、介于
    0
    2
    之间的ASCII字符范围、
    0
    1
    2
    。实际上,可以将其表示为
    [0-29]
在字符范围表达式中,字符的顺序并不重要<代码>[0815]与
[8510]
相同。因此
[1900]
[019]
相同

您希望
(19[0-9]{2}| 200[0-9]| 201[0-2])
匹配正确的年份范围。或者,如果您只想匹配四位数字,而不想进行范围验证,则可以使用
([0-9]{4})

月份和日期相同。您可以通过范围验证来完成,也可以通过匹配一个或两个数字来完成。我推荐后者

^([0-9]{1,2})/([0-9]{2})/([0-9]{4})$

尝试将结果转换为日期值。如果失败,则输入无效。如果成功,请检查结果日期是否在所需范围内。Regex是提供日期有效性检查的错误工具。

方括号创建的是字符范围,而不是数字范围:

  • [A-Z]
    匹配从
    A
    Z
    的所有ASCII字符
  • [1900-2012]
    匹配
    1
    9
    0
    、介于
    0
    2
    之间的ASCII字符范围、
    0
    1
    2
    。实际上,可以将其表示为
    [0-29]
在字符范围表达式中,字符的顺序并不重要<代码>[0815]与
[8510]
相同。因此
[1900]
[019]
相同

您希望
(19[0-9]{2}| 200[0-9]| 201[0-2])
匹配正确的年份范围。或者,如果您只想匹配四位数字,而不想进行范围验证,则可以使用
([0-9]{4})

月份和日期相同。您可以通过范围验证来完成,也可以通过匹配一个或两个数字来完成。我推荐后者

^([0-9]{1,2})/([0-9]{2})/([0-9]{4})$
尝试将结果转换为日期值。如果失败,则输入无效。如果成功,请检查结果日期是否在所需范围内。Regex是提供日期有效性检查的错误工具。

试试这个

\A[0-9]{2}\/[0-9]{2}\/[1900-2012]\z
它应该与日期匹配,格式为dd/mm/yyyy(1900年至2012年)

试试这个

\A[0-9]{2}\/[0-9]{2}\/[1900-2012]\z

它应该与日期匹配,格式为dd/mm/yyyy(1900年至2012年)

我在这里回答了一个类似的问题:。它只需要在提取部分进行一些修改

编辑: 您可以通过以下方式修改该函数:

function parse(str) {    // str format: 'dd/mm/yyyy'
    var d = str.substr(0,2),
        m = parseInt(str.substr(3,2)) - 1,
        y = str.substr(6,4);
    var D = new Date(y,m,d);
    return (D.getFullYear() == y && D.getMonth() == m && D.getDate() == d) ? D : 'invalid date';
}

我在这里回答了一个类似的问题:。它只需要在提取部分进行一些修改

编辑: 您可以通过以下方式修改该函数:

function parse(str) {    // str format: 'dd/mm/yyyy'
    var d = str.substr(0,2),
        m = parseInt(str.substr(3,2)) - 1,
        y = str.substr(6,4);
    var D = new Date(y,m,d);
    return (D.getFullYear() == y && D.getMonth() == m && D.getDate() == d) ? D : 'invalid date';
}
(?
似乎在我做的测试中起作用

(?<!\d)((((0?\d)|([12]\d)|(3[01]))/(((0?((1[02]?)|([3578]))))|(1[0-2])))|(((0?\d)|([12]\d))/(0?2))|(((0?\d)|([12]\d)|(30))/((0?[2469])|(11))))/((19)|(20))\d\d
(?
前面的正则表达式匹配无效日期,如2012年2月31日,但这个日期似乎更规范一些。

(?)?
似乎在我做的测试中起作用

(?<!\d)((((0?\d)|([12]\d)|(3[01]))/(((0?((1[02]?)|([3578]))))|(1[0-2])))|(((0?\d)|([12]\d))/(0?2))|(((0?\d)|([12]\d)|(30))/((0?[2469])|(11))))/((19)|(20))\d\d
(?

以前的正则表达式匹配无效日期,如2012年2月31日,但这个日期似乎更规范。

@David:hint:this
0[1-9]| 1[012]
匹配月份名称(
01
12
)@David:hint
0[1-9]| 1[012]
匹配月份名称(
01
12
)你想要一个只使用正则表达式的解决方案还是其他任何解决方案都可以?我发现这与此类似。你想要一个只使用正则表达式的解决方案还是其他任何解决方案都可以?我发现这与此类似。你不必逃避斜杠吗???@David:斜杠在正则表达式中没有任何意义。一些语言,如JavaScript,使用正斜杠来分隔正则表达式ral,类似于
/'\/“/
。在这些情况下,您必须在正则表达式中转义正斜杠,以便JS找到正则表达式的正确结尾。这是“JavaScript正则表达式文字”要求。您还可以使用
新正则表达式(“'/\”)
。在这里,您必须转义引号,以便JS可以找到字符串的正确结尾。这是“JavaScript字符串文字”要求。这些都与正则表达式本身无关。因此,不必总是转义斜杠。不必转义斜杠吗???@David:斜杠在正则表达式中没有任何意义。有些语言,如JavaScript,使用正斜杠来分隔正则表达式文字,如
/'\/”/
。在这些情况下,您必须在正则表达式中转义正斜杠,以便JS找到正则表达式的正确结尾。这是“JavaScript正则表达式文字”要求。您还可以使用
新正则表达式(“'/\”)
。这里您必须转义引号,以便JS可以找到字符串的正确结尾。这是“JavaScript字符串文字”“要求。所有这些都不必与正则表达式本身相关。因此,不必总是逃避正向斜杠。