V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
baba5
V2EX  ›  前端开发

求助正则大佬

  •  
  •   baba5 · 2022-05-25 10:10:43 +08:00 · 2003 次点击
    这是一个创建于 674 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2022-05-25 10:49:47 +08:00
    2. 端口检查的:

    ^([1-9]|[1-9]\\d{1,3}|[1-6][0-5][0-5][0-3][0-5])$|^([1-9]|[1-9]\\d{1,3}|[1-6][0-5][0-5][0-3][0-5])-([1-9]|[1-9]\\d{1,3}|[1-6][0-5][0-5][0-3][0-5])$


    有没有更好的方案,欢迎大佬指教
    第 2 条附言  ·  2022-05-25 11:09:30 +08:00
    端口号校验更正:

    ^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$|^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])-([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$
    第 3 条附言  ·  2022-05-25 11:47:41 +08:00
    ip 、ip 范围、网段及域名校验:

    (^((?:(?:[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]))|(\-((?:(?:[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]))))?)|((?:(?:[a-zZ-Z0-9]+)\.){2}((com|org|net)\.)?(com|cn|net|org|biz|info|cc|tv|top|vip)))
    第 4 条附言  ·  2022-05-25 12:50:05 +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,})|((?:(?:[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])))?)$

    端口及端口范围校验正则:
    ^([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]))?$

    非常感谢评论区各位大佬提供的各种思路和帮助,希望对有相同需求的朋友也有帮助。
    第 5 条附言  ·  2022-05-25 14:57:32 +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,})$

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

    教你怎么不用正则:它要正则,你就给一个对象,里面提供一个 test 函数,基本上就能完美绕过限制
    harmless
        15
    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
        16
    xiangyuecn  
       2022-05-25 12:00:38 +08:00   ❤️ 1
    //奇丑无比的超长正则表达式,巨难维护
    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
        17
    baba5  
    OP
       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
        18
    baba5  
    OP
       2022-05-25 12:03:51 +08:00
    @xiangyuecn 666 ,大佬好思路呀,我去试一下
    harmless
        19
    harmless  
       2022-05-25 13:12:27 +08:00
    @baba5 有校验啊,反倒是你这个好像有问题
    harmless
        20
    harmless  
       2022-05-25 13:19:18 +08:00   ❤️ 1
    ic2y
        21
    ic2y  
       2022-05-25 13:35:31 +08:00
    为啥 不能从文本语义的角度分析, 不一定非要使用正则。可以先分解为基础的元数据,分别对元数据分段进行正则校验。
    weixiangzhe
        22
    weixiangzhe  
       2022-05-25 13:40:38 +08:00
    @xiangyuecn 我觉得你这个最好 666
    baba5
        23
    baba5  
    OP
       2022-05-25 14:44:21 +08:00
    @harmless 👍
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5165 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 74ms · UTC 09:30 · PVG 17:30 · LAX 02:30 · JFK 05:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.