zu1k
V2EX  ›  问与答

如何从字符串中提取 ip 地址(不用正则)

  •  
  •   zu1k · Sep 27, 2020 via Android · 3201 views
    This topic created in 2054 days ago, the information mentioned may be changed or developed.

    在网上搜如何从字符串中提取 ip 地址,出来的全都是正则的实现。我想找一个不用正则的实现,支持 IPv4 和 IPv6 的提取,请大佬们指条明道

    Supplement 1  ·  Sep 28, 2020
    感谢大家的回复,我解释几个疑问

    1. 为什么不用正则?

    其实已经有正则的实现了,目前已经用了很久的就是正则的实现。

    程序里面需要对字符串进行处理,目前的实现是用正则检测 IP,处理后进行替换。

    重构的目标是,类似于流的那种读入,实时的检测 IP 地址,检测到 IP 后实时处理,然后插入必要的信息而不是在最后统一进行字符串替换。

    搜了一下正则表达式也有相关针对流输入的实现,但是我考虑的是我自己实现一下只针对 IP 地址的自动机效率肯定比直接用正则快。

    并且,输入可能是一个文件,内容比较多,使用正则表达式我目前貌似只能分段读入然后用正则,分段的地方还得特殊处理,比较麻烦,所以想要实现一个能够处理类似流的输入的自动机。

    2. 是老板的无理要求吗?

    不是,是自己的小项目,也是练习编程

    有前面这个想法后,我网上各种搜,绝大部分都是提供的正则表达式解决方案,有针对 IPv4 的方法,但是 IPv6 的没有找到
    23 replies    2020-09-28 10:18:24 +08:00
    hanxiV2EX
        1
    hanxiV2EX  
       Sep 28, 2020 via Android
    ipv4 可以遍历查找数字和点
    mikeguan
        2
    mikeguan  
       Sep 28, 2020 via Android
    查找应该都算是用了正则
    lxilu
        3
    lxilu  
       Sep 28, 2020 via iPhone
    找个正则调试器,看正则是怎么运行的
    leishi1313
        4
    leishi1313  
       Sep 28, 2020 via Android
    那你把正则展开成 if else 不就行了😂
    binux
        5
    binux  
       Sep 28, 2020 via Android   ❤️ 3
    手写正则文法解析器呗
    raaaaaar
        6
    raaaaaar  
       Sep 28, 2020 via Android
    先造一个正则的轮子,然后给它取名字为“反则”
    xJogger
        7
    xJogger  
       Sep 28, 2020 via Android
    找一个阿三程序员替你找。
    Rxianbei
        8
    Rxianbei  
       Sep 28, 2020 via Android   ❤️ 1
    emmm,先生成 1.1.1.1 到 255.255.255.255 的所有有可能的 ipv4 地址入库,然后再进行文本循环匹配,欧耶
    jay4497
        9
    jay4497  
       Sep 28, 2020
    @Rxianbei 他还要 IPv6 的 [:doge:]
    zxCoder
        10
    zxCoder  
       Sep 28, 2020
    @jay4497 没问题,就多几位 🐕
    xiri
        11
    xiri  
       Sep 28, 2020
    为什么不能用正则呢?正则底层也是很多的 if else 啊
    itechify
        12
    itechify  
    PRO
       Sep 28, 2020 via Android
    emm...不熟悉正则还是怎么的。实现需求来说,搜索引擎答案大多推荐一个方案那么他是比较好实现且坑少,方案成熟,有 bug 也容易修复,不熟悉可以学习。如果单纯自己学习,尝试其他方法实现,应该可以造轮子,写一个算法获取字符串中的所有 0-9 和.的子字符串,每个进行 IP 规则匹配就行(.分割后 0~255 等规则)
    jjplay
        13
    jjplay  
       Sep 28, 2020
    IPV4 匹配 字符串 "." , 然后搜该 "." 的下 1-3 位字符是不是(0-255)的数字,如此循环匹配 3 次
    IPV6 匹配 字符串 ":" , 同上,缩写匹配字符串 "::"
    glfpes
        14
    glfpes  
       Sep 28, 2020 via iPhone
    要是老板给我提这个需求,第一件事我要做的就是问他为啥不能用正则。
    abc0123xyz
        15
    abc0123xyz  
       Sep 28, 2020
    雇几个视力还行的老头老太太,简单教一下,人眼识别。。
    chinvo
        16
    chinvo  
       Sep 28, 2020 via iPhone
    炼丹,生成随机假文本,然后随机在假文本中插入 IP 地址,最后一股脑喂给一个三层的网络,运气好的话比雇几个老头老太太要准一点
    netnr
        17
    netnr  
       Sep 28, 2020
    抛弃最佳解决问题的方法,需要付出代价
    Hyseen
        18
    Hyseen  
       Sep 28, 2020
    不用正则的话就自己写个 DFA 吧
    ysc3839
        19
    ysc3839  
       Sep 28, 2020 via Android
    去看编译原理,根据网上找到的正则表达式实现对应的自动机。
    dtgxx
        20
    dtgxx  
       Sep 28, 2020
    你弄懂什么是流式处理了吗
    zu1k
        21
    zu1k  
    OP
       Sep 28, 2020
    @Hyseen 目前是这个想法,不知道工作量大不大,太大我就放弃了,牺牲计算机 cpu 来换我不秃头

    @netnr 的确,目前关研究这个事就够烦人的了

    @chinvo 炼金师 VS 老太太

    @jjplay 实际深入到细节,还是有一些坑

    @oneisall8955 目前用的正则,已经能够实现目前的需求了,但是我想重构后让我的程序功能和效率更加强大一些,也算是学习了吧

    @xiri @leishi1313 我不想用递归下降了,我想查表

    @lxilu 有这个想法了
    zu1k
        22
    zu1k  
    OP
       Sep 28, 2020
    @dtgxx 不太清楚流式处理,搜了一下跟批处理相对应?我的意思是数据的输入是流式的,就像用户用键盘输入内容一样,程序获取到的是字节流,程序的目标是对原始输入只 scan 一次,one pass 的那种感觉,及时记录状态和相关信息,尽量不回过头来再读取一遍,对前面已经分析过并且无用的信息就丢弃掉,运行时内存占用也小

    @ysc3839 一会中午去借本书再复习一下编译原理,哭
    ysc3839
        23
    ysc3839  
       Sep 28, 2020
    @zu1k 个人理解流式处理是针对磁带机等无法进行随机存取的设备提出的,和批处理没关系,批处理是早期操作系统执行任务的概念。
    https://zh.wikipedia.org/wiki/%E6%89%B9%E5%A4%84%E7%90%86%E4%BB%BB%E5%8A%A1
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5740 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 71ms · UTC 03:38 · PVG 11:38 · LAX 20:38 · JFK 23:38
    ♥ Do have faith in what you're doing.