zu1k
V2EX  ›  问与答

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

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

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

    @chinvo 炼金师 VS 老太太

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

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

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

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

    @ysc3839 一会中午去借本书再复习一下编译原理,哭
    ysc3839
    ysc3839
    Sep 28, 2020
    23
    @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   ·   Privacy   ·   Solana   ·   1092 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 56ms · UTC 23:01 · PVG 07:01 · LAX 15:01 · JFK 18:01
    ♥ Do have faith in what you're doing.