我试图对一个包含单个特殊字符的字符串进行连续验证,该字符串也位于中间。连续验证意味着即使是部分字符串也应该返回true。
通过一个像四个数字这样的字符串的例子--三个字母数字
案例
1) 1应确认
2) 432应确认
3) 1234-应验证
4) 1q21-不应验证
5) 4532-a3s应验证
6) 8023-AS 12不应验证
我现在的准则是
/^([0-9]{1,4})?\-([a-zA-Z0-9]{1,3})?$/;这并不能验证上述清单中的案例1和2。
它确实验证了上述案例3、4、5、6的有效性。
发布于 2019-05-14 06:40:56
您可以使第一个组不是可选的,然后是一个可选的连字符,如果不需要的话,可以使组非捕获。如果您也希望只匹配数字,则可以使用替换。
^(?:\d+|[0-9]{4}-?(?:[a-zA-Z0-9]{1,3})?)$^开始(?:非捕获群\d+匹配1+数字|或[0-9]{4}-?匹配具有可选-的4位数字(?:非捕获群[a-zA-Z0-9]{1,3}匹配字符类中列出的任何1-3次。
- `)?` Close group and make it optional
)闭非捕获群$末端如果允许的数字不超过4位,并且在第二部分中应该有连字符,您也可以使用:
^(?:\d{1,4}(?:-[a-zA-Z0-9]{0,3})?|\d{4})$发布于 2019-05-14 07:21:02
我会使用简单的javascript来解决这个问题。循环遍历每个字符,检查它们在哪个索引范围内,并相应地应用验证。
function validateString(str){
if(str.length > 8 || str.length == 0) return false;
for(var i=0;i<str.length;++i){
if(i < 4){
if(!(str.charAt(i) >= '0' && str.charAt(i) <= '9')) return false;
}else if(i == 4){
if(str.charAt(i) != '-') return false;
}else{
if(!(str.charAt(i) >= '0' && str.charAt(i) <= '9' || str.charAt(i) >= 'a' && str.charAt(i) <= 'z' || str.charAt(i) >= 'A' && str.charAt(i) <= 'Z')) return false;
}
}
return true;
}
const tests = [
'1',
'432',
'1234-',
'1q21-',
'4532-a3s',
'8023-as12',
'1-2a',
'1234ab',
'1-a',
'5555555555555',
'5555qqq',
'1234-@#@'
];
tests.forEach((value) => {
console.log(value + " => " + validateString(value));
});
发布于 2019-05-14 07:07:06
这不是regex特别擅长的东西但是..。
^(?:\d{1,3}|\d{4}(?:-([a-zA-Z0-9]{0,3}))?)$您必须逐步构建部件,其中满意的部分是完整的、强制性的,而不满意的部分则是可选的。
https://stackoverflow.com/questions/56124304
复制相似问题