求助正则大佬

2022-05-25 10:10:43 +08:00
 baba5

由于用了 xrender ,表单字段校验全部得用一个正则来配置完成,遇到了一些困难,求助各位大佬,需求如下(主要是第一个): 提前感谢。

2252 次点击
所在节点    前端开发
23 条回复
creanme
2022-05-25 10:12:55 +08:00
全部用一个正则会不会有问题?比如第一个输入框要求 0-9, 第二个框 a-z ,如果用一个正则,然后在第一个输入框里面输入 0-9 也能通过?
baba5
2022-05-25 10:16:20 +08:00
@creanme 我表达得有问题,这是两个字段,需要两个正则,1 和 2 是两个需求。
sugars
2022-05-25 10:19:54 +08:00
https://regexr.com/3dt4r
这个可能对你有帮助,虽然无法完美解决你全部需求
ynyounuo
2022-05-25 10:24:52 +08:00
所以你遇到的困难是什么?就是完全不会做,找个网友帮你写好?
sugars
2022-05-25 10:26:49 +08:00
@ynyounuo 确实像是,就算不会,谷歌完全能找到不少类似场景的资料
比如 ip-range 的方案 https://regex101.com/r/1dg92i/1
baba5
2022-05-25 10:29:04 +08:00
@sugars 感谢提供思路
baba5
2022-05-25 10:42:23 +08:00
@ynyounuo 问题就是满足单个的条件都能找到,我组合在一起不对。菜鸟真心求教 QAQ
Lweiis
2022-05-25 10:50:53 +08:00
说个笨办法,用 | (or condition) 来组合一下?
baba5
2022-05-25 10:54:39 +08:00
@Lweiis 我现在就是一个条件一个条件找,然后用 | 组合的 QAQ
harmless
2022-05-25 11:00:11 +08:00
端口范围没法用正则检验前面的数比后面的小
harmless
2022-05-25 11:07:05 +08:00
如果不要求前面的端口号一定比后面的小可以用这个
^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])(?:-([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$
baba5
2022-05-25 11:07:05 +08:00
@harmless 是的
baba5
2022-05-25 11:11:09 +08:00
@harmless 感谢大佬,比我那个用 | 组合的优雅哈哈
xiangyuecn
2022-05-25 11:37:44 +08:00
原来真有这么沙雕的组件 把正则表达式当万能的了

教你怎么不用正则:它要正则,你就给一个对象,里面提供一个 test 函数,基本上就能完美绕过限制
harmless
2022-05-25 11:45:02 +08:00
校验 IP 、IP 段和域名
^(?:(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(?:-(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])|/(?:[0-9]|[1-2][0-9]|3[0-2]))?|(?:[a-z0-9]+(?:-[a-z0-9]+)*\.)+[a-z]{2,})$
xiangyuecn
2022-05-25 12:00:38 +08:00
//奇丑无比的超长正则表达式,巨难维护
exp=/.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|.|./;
console.log(exp.test("123-456"))
console.log(exp.test("456-123"))

//用函数伪装正则表达式,要 match 就加一个 match 函数
exp={
test:function(str){
var arr=str.split("-")
var t=function(s){//测试单个端口
var v=+s||0;
return ""+v == s && v>=0 && v<=65535
}
if(arr.length==1){
return t(arr[0])
}else if(arr.length==2){
//左边端口不能大于右边端口
return t(arr[0]) && t(arr[1]) && +arr[0]<=+arr[1]
}
return false
}
}
console.log(exp.test("abc-efg"))
console.log(exp.test("999999"))
console.log(exp.test("456-123"))
console.log(exp.test("123-456789"))
console.log(exp.test("123-456"))
baba5
2022-05-25 12:02:36 +08:00
@harmless 大佬这个好像没有网段校验,我在你的基础上加上了网段校验

^(?:(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])(?:-(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])|(?:[0-9]|[1-2][0-9]|3[0-2]))?|(?:[a-z0-9]+(?:-[a-z0-9]+)*\.)+[a-z]{2,})|((?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(?:(\/([1-9]|[1-2]\d|3[0-1])))?)$
baba5
2022-05-25 12:03:51 +08:00
@xiangyuecn 666 ,大佬好思路呀,我去试一下
harmless
2022-05-25 13:12:27 +08:00
@baba5 有校验啊,反倒是你这个好像有问题
harmless
2022-05-25 13:19:18 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/855137

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX