Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/74.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_Jquery_Regex - Fatal编程技术网

Javascript 正则表达式在应该失败时不会失败

Javascript 正则表达式在应该失败时不会失败,javascript,jquery,regex,Javascript,Jquery,Regex,我有一个正则表达式: var pat = new RegExp("[0-9]{1}\.[0-9]{1}"); 我使用jQuery从文本框中获取数字,如下所示: var theValue = $(item).val(); 我一直在输入数字并用这行代码测试正则表达式: alert(pat.test(theValue)); 如果我输入数字111,它就通过了。不应出现这种情况,因为第一个数字必须是0-9,后跟一个句点,然后再后跟另一个数字0-9。我看不出我做错了什么。你忘了锚定表达式 var pa

我有一个正则表达式:

var pat = new RegExp("[0-9]{1}\.[0-9]{1}");
我使用jQuery从文本框中获取数字,如下所示:

var theValue = $(item).val();
我一直在输入数字并用这行代码测试正则表达式:

alert(pat.test(theValue));

如果我输入数字111,它就通过了。不应出现这种情况,因为第一个数字必须是0-9,后跟一个句点,然后再后跟另一个数字0-9。我看不出我做错了什么。

你忘了锚定表达式

var pat = new RegExp("^[0-9]{1}\.[0-9]{1}$");

你忘了锚定表达式

var pat = new RegExp("^[0-9]{1}\.[0-9]{1}$");

要在字符串中使用,需要转义
\
,以便显示反斜杠字符

var pat = new RegExp("[0-9]{1}\\.[0-9]{1}");
一种更简洁、或许更可靠的形式是:

/[0-9]\.[0-9]/

假设模式应该匹配一个数字,后跟一个句点和另一个数字。

要在字符串中使用,需要转义
\
,才能显示反斜杠字符

var pat = new RegExp("[0-9]{1}\\.[0-9]{1}");
一种更简洁、或许更可靠的形式是:

/[0-9]\.[0-9]/

假设模式应该匹配一个数字,后跟一个句点和另一个数字。

反斜杠执行的是字符串转义,而不是正则表达式转义。或使用:

new RegExp("[0-9]{1}\\.[0-9]{1}");
或者许多人喜欢的正斜杠()语法:


编辑:另外,正如上面ianpgall指出的,{1}是不必要的,因为字符类
[0-9]
不是惰性的,除非后面跟一个

反斜杠是字符串转义,而不是正则表达式转义。或使用:

new RegExp("[0-9]{1}\\.[0-9]{1}");
或者许多人喜欢的正斜杠()语法:


编辑:另外,正如ianpgall在上面指出的,{1}是不必要的,因为字符类
[0-9]
不是惰性的,除非后面跟一个

如果您用斜杠代替引号来编写正则表达式,这就很好了

var pat = /[0-9]{1}\.[0-9]{1}/;
var theValue = ".111";
alert(pat.test(theValue));
​
我会使用
\d
而不是
[0-9]


字符串中的
\.
正在转义字符串中的
,而不是在正则表达式中。所以你的正则表达式实际上是
[0-9]{1}.[0-9]{1}
,它匹配一个数字,任何东西,然后是另一个数字。而不是数字、句点、数字。

如果您使用斜杠来编写正则表达式,而不是引号,这就很好了

var pat = /[0-9]{1}\.[0-9]{1}/;
var theValue = ".111";
alert(pat.test(theValue));
​
我会使用
\d
而不是
[0-9]


字符串中的
\.
正在转义字符串中的
,而不是在正则表达式中。所以你的正则表达式实际上是
[0-9]{1}.[0-9]{1}
,它匹配一个数字,任何东西,然后是另一个数字。看了最好的答案后,我想再加强一点,这样可以处理大多数情况

var pat = new RegExp("[0-9]{1}\\.[0-9]{1}");
var theValue = $("#item").val();
if (theValue.length == 3)
    alert(pat.test(theValue));
else
    alert("false");

参考

在看了最好的答案后,我想再加强一点,这样可以处理大多数情况

var pat = new RegExp("[0-9]{1}\\.[0-9]{1}");
var theValue = $("#item").val();
if (theValue.length == 3)
    alert(pat.test(theValue));
else
    alert("false");


请参阅

为什么要添加
{}
部分?能否在小提琴中复制?@ianpgall:{n}符号确保前面的表达式至少匹配n次。[0-9]{1}验证了一个数字在小数点之前和小数点之后各出现一次。@Sheridanbulger我知道它的作用,但我想我习惯了这样一个问题:为什么要添加
{}
部分?你能用小提琴重现吗?@ianpgall:{n}符号确保前面的表达式至少匹配n次。[0-9]{1}让他确认一个数字在小数点之前和小数点之后各出现一次。@Sheridanbulger我知道它是什么,但我想我习惯了这不是它通过的原因。@acheong87:即使没有锚,111也不应该通过,因此,否决票。啊,我不同意,问题是这样的“第一个数字必须是0-9,后跟一个句点,然后再后跟另一个数字0-9“所以锚定也是达到预期结果的一个重要因素。@LeeKowalkowski:第一个数字不一定是第一个字符。@ianpgall:你怎么知道需要锚定?这不是它通过的原因。@acheong87:即使没有锚定,111也不应该通过,因此,否决票。唉,我不同意,问题是“第一个数字必须是0-9,后面跟一个句点,然后再跟另一个数字0-9”,因此锚定也是达到预期结果的一个重要因素。@LeeKowalkowski:第一个数字不一定是第一个字符。@ianpgall:你怎么知道需要锚定?+1来确定第一个字符,但是值得指出的是,
{1}
从来都不是必需的,对于静态正则表达式,正则表达式文本(例如
/\d\.\d/
)比正则表达式构造函数更好。如果只是出于风格的考虑。@LeeKowalkowski:两个观点都同意<代码>/[0-9]\.[0-9]/将是更好的样式。或者
/\d\.\d/
尽管我不得不承认,我不记得
\d
是否会匹配的不仅仅是
0-9
。谢谢你,这总是很简单的。关于样式和{1}.+1,首先指出这一点很好,但值得指出的是,
{1}
从来都不是必需的,并且regex文本(例如,
/\d\.\d/
)比静态regex的RegExp构造函数更好。如果只是出于风格的考虑。@LeeKowalkowski:两个观点都同意<代码>/[0-9]\.[0-9]/将是更好的样式。或者
/\d\.\d/
尽管我不得不承认,我不记得
\d
是否会匹配的不仅仅是
0-9
。谢谢你,这总是很简单的。关于样式和{1}的观点很好。既然正则表达式已经这样做了,并且已经声明了,为什么还要检查长度呢?另外,根据OP实际需要什么,他们可能或可能不想要一个数字,或者在一个字符串的中间,这是无济于事的。我同意,为什么麻烦为这个问题巩固答案(特别是如此糟糕)。目前的正则表达式不检查长度,但可以。e、 g.
/^\d\.\d$/
强制执行