Javascript 使用正则表达式限制字段中输入的帐户ID
我在网站上有一个表单,使用Angular 1.6,其中一个字段允许用户输入应该执行操作的帐户ID。(实际上,这些表单中有几个都由同一个控制器供电。) 要求用户用任何非字母数字字符分隔ID 但是,在这些表单的某些实例中,我需要限制可以指定的ID数量。(所有ID都符合模式Javascript 使用正则表达式限制字段中输入的帐户ID,javascript,angularjs,regex,Javascript,Angularjs,Regex,我在网站上有一个表单,使用Angular 1.6,其中一个字段允许用户输入应该执行操作的帐户ID。(实际上,这些表单中有几个都由同一个控制器供电。) 要求用户用任何非字母数字字符分隔ID 但是,在这些表单的某些实例中,我需要限制可以指定的ID数量。(所有ID都符合模式[a-z0-9])我已经通过以下正则表达式模式和ng模式接近我所需要的。regexp存储在app.js中的变量中,该变量在HTML中引用: new RegExp(`^(?:(?=([a-z0-9]+))\\1[^a-zA-Z0-9]
[a-z0-9]
)我已经通过以下正则表达式模式和ng模式接近我所需要的。regexp存储在app.js中的变量中,该变量在HTML中引用:
new RegExp(`^(?:(?=([a-z0-9]+))\\1[^a-zA-Z0-9]*){1,${maxSites}}$`);
不幸的是,这还与帐户ID后面的逗号、空格等相匹配。例如,我的正则表达式与foobar、
(“foobar”后跟逗号和空格)相匹配,但它不应该匹配
下面的表格显示了基于maxSites
,我希望工作正则表达式能够匹配的内容:
Input | Max | Max 2 | Max 3
foobar | yes | yes | yes
foobar, | no | no | no
foobar, | no | no | no
foobar,bizbaz | no | yes | yes
foobar, bizbaz1 | no | yes | yes
foobar bizbaz1 | no | yes | yes
foobar, bizbaz1, | no | no | no
foobar, bizbaz1, binbong2 | no | no | yes
输入|最大值|最大值2 |最大值3
foobar |是|是|是
foobar,|不|不|不
foobar,|不|不|不
foobar,bizbaz |不|是|是
foobar,bizbaz1 |不|是|是
foobar bizbaz1 |不|是|是
foobar,bizbaz1,|不|不|不
foobar、bizbaz1、binbong2 |不|不|是
有没有办法用RegExp做到这一点?下面是我的想法。 ^([a-z0-9]+){1}(,[a-z0-9]+){0,(MAX-1)}
此站点允许您测试要测试的字符串,并可以查看其是否匹配。第一个组不能有逗号,只能有一个字母数字字符串。第二组首先包含逗号,因此不能有尾随逗号,并且可以重复0到MAX-1。我希望这能有所帮助。以下是我的想法。 ^([a-z0-9]+){1}(,[a-z0-9]+){0,(MAX-1)}
此站点允许您测试要测试的字符串,并可以查看其是否匹配。第一个组不能有逗号,只能有一个字母数字字符串。第二组首先包含逗号,因此不能有尾随逗号,并且可以重复0到MAX-1。我希望这会有所帮助。除非您有其他更令人信服的理由使用正则表达式,否则我更喜欢使用自定义验证函数来验证。看起来您确实在尝试拆分一个字符串,然后验证(非空)元素的数量是否小于或等于一个数字。这是一个使用正则表达式的好时机,也是一个使用正则表达式的坏时机。下面是一个验证字符串形式的简单函数:
function isValidAction(str, max) {
if (!str || !max)
return false;
//split the string by non-alphanumeric
var actions = str.split(/[^a-zA-Z\d]/);
//validate length
var valid = actions.length <= max;
//validate every element has non-empty content
valid = valid && actions.every(function(a) {
return a.length > 0;
});
return valid;
}
函数是有效的(str,max){
如果(!str | |!max)
返回false;
//按非字母数字拆分字符串
var actions=str.split(/[^a-zA-Z\d]/);
//验证长度
var valid=actions.length 0;
});
返回有效;
}
然后,用ng change
手动将其连接起来,并使用类似于手动验证自定义逻辑的东西
除非您有其他更令人信服的理由使用正则表达式,否则我更喜欢使用自定义验证函数来验证。看起来您确实在尝试拆分一个字符串,然后验证(非空)元素的数量是否小于或等于一个数字。这是一个使用正则表达式的好时机,也是一个使用正则表达式的坏时机。下面是一个验证字符串形式的简单函数:
function isValidAction(str, max) {
if (!str || !max)
return false;
//split the string by non-alphanumeric
var actions = str.split(/[^a-zA-Z\d]/);
//validate length
var valid = actions.length <= max;
//validate every element has non-empty content
valid = valid && actions.every(function(a) {
return a.length > 0;
});
return valid;
}
函数是有效的(str,max){
如果(!str | |!max)
返回false;
//按非字母数字拆分字符串
var actions=str.split(/[^a-zA-Z\d]/);
//验证长度
var valid=actions.length 0;
});
返回有效;
}
然后,用ng change
手动将其连接起来,并使用类似于手动验证自定义逻辑的东西
这几乎正是我想要的。我对您提供的RegExp做了一点小小的更改,只是因为我不希望逗号成为用户可以使用的唯一分隔符。最后一个RegExp看起来是这样的:
^([a-z0-9]+){1}([\W]+[a-z0-9]+){0,4}$
这几乎就是我想要的。我对您提供的RegExp做了一点小小的更改,只是因为我不希望逗号成为用户可以使用的唯一分隔符。最后一个RegExp是这样的:^([a-z0-9]+){1}([\W]+[a-z0-9]+){0,4}$
,对于任何想找到类似问题答案的人来说。。。我真的觉得这将是解决这个问题的最佳做法。它非常优雅,遵循Angular的所有最佳实践。我没有将其标记为可接受答案的唯一原因是,提出的问题是“有没有一种方法可以使用RegExp实现这一点”,而这个答案并没有直接说明这一点。(然而,它确实提供了一个更好的选择。)不用担心。稍后,当您获得向上投票帖子的特权时,您可以注意到,此答案有助于向上投票(并接受另一个答案)。对于任何想要回答类似问题的人。。。我真的觉得这将是解决这个问题的最佳做法。它非常优雅,遵循Angular的所有最佳实践。我没有将其标记为可接受答案的唯一原因是,提出的问题是“有没有一种方法可以使用RegExp实现这一点”,而这个答案并没有直接说明这一点。(然而,它确实提供了一个更好的选择。)不用担心。稍后,当您获得向上投票帖子的特权时,您可以注意到这样一个事实,即此答案有助于向上投票(并接受另一个答案)。