V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zu1k
V2EX  ›  问与答

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

  •  
  •   zu1k · 2020-09-27 23:58:32 +08:00 via Android · 2756 次点击
    这是一个创建于 1553 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2020-09-28 09:38:49 +08:00
    感谢大家的回复,我解释几个疑问

    1. 为什么不用正则?

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

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

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

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

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

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

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

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

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

    @chinvo 炼金师 VS 老太太

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

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

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

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

    @ysc3839 一会中午去借本书再复习一下编译原理,哭
    ysc3839
        23
    ysc3839  
       2020-09-28 10:18:24 +08:00
    @zu1k 个人理解流式处理是针对磁带机等无法进行随机存取的设备提出的,和批处理没关系,批处理是早期操作系统执行任务的概念。
    https://zh.wikipedia.org/wiki/%E6%89%B9%E5%A4%84%E7%90%86%E4%BB%BB%E5%8A%A1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1608 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 16:49 · PVG 00:49 · LAX 08:49 · JFK 11:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.