jquery regex continuous space



我想检查input,如果输入为空或输入连续空格,则显示错误。 单词之间只允许一个空格。 例如:

测试

正常测试

var pattern = /ss+/g;
$('a').click(function() {
if ($('input').val().length <= 2 || pattern.test($('input').val())) {
alert('error');
} else {
alert('ok go');
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a>check</a>
<input type="text"/>

它似乎有效,但它有问题,这样做以找到此问题:

连续输入5个空格,然后单击检查,它会提醒error但再次单击检查,它会提醒ok

当用户连续输入超过 2 个空格时应出错。

您可以使用trim方法,该方法比if语句中的代码更好。

trim() 方法从字符串的两端删除空格,在本例中为输入的值,之后您可以检查它是否等于空字符串并且工作正常

请参阅下面的示例

var pattern = /ss+/g;
$('a').click(function() {
if ($('input').val().trim()==='') {
alert('error');
} else {
alert('ok go');
}
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a>check</a>
<input type ="text" />

从 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test:

如果正则表达式设置了全局标志,test()lastIndex推进 正则表达式。随后使用test()将在str的子字符串处开始搜索 由lastIndex指定(exec()也将推进lastIndex属性)。

问题是在您的正则表达式与字符串匹配后,lastIndex属性将导致下一个匹配项在上一个匹配项之后开始。您可以通过在每次单击后输出pattern.lastIndex的值来验证这一点。

您可以通过在每次匹配后手动将lastIndex设置为零来解决此问题,例如

$('a').click(function() {
pattern.lastIndex = 0;
if ($('input').val().length <= 2 || pattern.test($('input').val())) {
alert('error');
} else {
alert('ok go');
}
});

您还可以通过一起摆脱pattern并编写来修复

$('a').click(function() {
if ($('input').val().length <= 2 || /ss+/g.test($('input').val())) {
alert('error');
} else {
alert('ok go');
}
});

请注意,您可以将模式更改为两次或多次/s{2,}/g匹配的空格。

最新更新