V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
James369
V2EX  ›  程序员

有没有比“正则表达式” 更简单直观的匹配技术?

  •  
  •   James369 · 2021-08-15 13:31:30 +08:00 · 6847 次点击
    这是一个创建于 1199 天前的主题,其中的信息可能已经有所发展或是发生改变。
    正则表达式:是很强大但感觉还是稍微复杂了一点,并且可读性也有点差。

    我现在有个小需求:
    1. 能够匹配一行字符(就一行不超过 100 个字符,能够匹配内部的英文数字符号等各种字符)。
    2. 简单直观易上手(也就是说新手小白看 5 分钟就可以上手自己编写规则)。
    第 1 条附言  ·  2021-08-16 08:57:46 +08:00
    找到了一个:grok,通过预定义规则的方式。
    第 2 条附言  ·  2021-08-16 11:39:01 +08:00
    #9 楼的方案也不错,要是支持中文更好。
    39 条回复    2021-08-17 22:08:34 +08:00
    ViggoSite
        1
    ViggoSite  
       2021-08-15 13:37:54 +08:00
    没有,自己写一个
    James369
        2
    James369  
    OP
       2021-08-15 13:40:54 +08:00
    @ViggoSite 你说得有道理,目前想到就是在正则表达式之上 定义一堆预制的模板,让小白直接操作模板。
    不过如果需要自己定制模板,又得回到正则表达式上来。
    randomboi
        3
    randomboi  
       2021-08-15 13:40:59 +08:00
    复杂的正则表达式的确可读性差,不过满足你这个小需求的应该比较简单
    ch2
        4
    ch2  
       2021-08-15 13:49:34 +08:00
    自动机本来就不是给非专业的用户用的
    James369
        5
    James369  
    OP
       2021-08-15 13:55:05 +08:00
    @ch2 参考“少儿编程”、“汉语编程”, 在核心上套一层马甲,让非专业用户可以亲近和接触
    512357301
        6
    512357301  
       2021-08-15 13:59:44 +08:00 via Android
    正则有简写和非简写模式,非简写模式比较符合认知
    简写看起来简洁,但是可读性不太好,非简写看起来冗长但是可读性好
    loading
        7
    loading  
       2021-08-15 14:01:17 +08:00
    写一大堆 if else 然后用 find replace,清晰明了。
    agagega
        8
    agagega  
       2021-08-15 14:02:29 +08:00 via iPhone   ❤️ 2
    直接做成可视化吧,拖 DFA 来构造正则表达式🐶
    kilasuelika
        9
    kilasuelika  
       2021-08-15 14:05:12 +08:00 via Android   ❤️ 5
    看看这个:Simple Regex Language
    https://simple-regex.com/
    xiangyuecn
        10
    xiangyuecn  
       2021-08-15 14:30:32 +08:00   ❤️ 2
    然后做出一个比正则表达式还复杂的东西🐶
    zerofancy
        11
    zerofancy  
       2021-08-15 14:51:53 +08:00 via Android
    类似 word 的通配符自己撸一套?
    sutra
        12
    sutra  
       2021-08-15 14:57:00 +08:00   ❤️ 2
    @kilasuelika 这个 SRL 看着,我怎么宁愿看正则表达式呢。哈哈
    MrKrabs
        13
    MrKrabs  
       2021-08-15 15:05:10 +08:00
    可读性不该搞个 parser 吗
    Alexhex
        14
    Alexhex  
       2021-08-15 15:39:09 +08:00
    正则+注释
    binux
        15
    binux  
       2021-08-15 15:42:21 +08:00 via Android
    你这需求不完整啊,按照最小实现,精确匹配就能满足你的能够匹配一行字符,无限长度,包含内部任意字符的要求。
    szzhiyang
        16
    szzhiyang  
       2021-08-15 15:45:44 +08:00
    没有。
    szzhiyang
        17
    szzhiyang  
       2021-08-15 15:47:32 +08:00
    正则表达式的可读性问题可以用注释解决。
    fpure
        18
    fpure  
       2021-08-15 15:49:02 +08:00
    自己手写个有穷自动机?
    wolfie
        19
    wolfie  
       2021-08-15 15:53:41 +08:00
    什么语言
    Java 有个 Charmatcher
    musi
        20
    musi  
       2021-08-15 15:56:50 +08:00
    手动用状态机写个 parser,然后再封装一层
    SingeeKing
        21
    SingeeKing  
       2021-08-15 16:08:32 +08:00 via iPhone   ❤️ 1
    @kilasuelika 这东西哪里 simple 了… 觉得学这套语法还不如直接去学正则更快一点。。。
    ily433664
        22
    ily433664  
       2021-08-15 16:39:44 +08:00
    设定好几个规则然后再转换成正则
    Trim21
        23
    Trim21  
       2021-08-15 17:01:36 +08:00 via Android
    glob 和扩展过的 glob 吧
    jupiter157
        24
    jupiter157  
       2021-08-15 17:25:09 +08:00 via iPhone
    有两个想法,一是常用的设定别名,如 emailAddress, ipAddress
    二是提供正反例,自动生成表达式。
    nil333
        25
    nil333  
       2021-08-15 17:28:35 +08:00
    就我的知识水平只能说没有。如果有的话希望大佬可以 @我
    akira
        26
    akira  
       2021-08-15 17:46:21 +08:00
    那你需要 的是正则的基础功能,
    那其实正则也满足你这 2 点要求了啊。。
    Pagliacii
        27
    Pagliacii  
       2021-08-15 18:08:47 +08:00   ❤️ 1
    PolarBears
        28
    PolarBears  
       2021-08-15 20:25:11 +08:00   ❤️ 1
    没有吧,要不看看 Grok?虽然本身也是预定义了一堆表达式的正则
    https://grokdebug.herokuapp.com/patterns#
    swsh007
        29
    swsh007  
       2021-08-15 20:42:35 +08:00 via Android
    还是正则好了
    shihira
        30
    shihira  
       2021-08-15 21:08:32 +08:00
    其实有没有可能,比如说输入一组测试样例,然后自动生成合理的正则
    比如我输入 https http ftp sftp,生成`.*tps?`,但最好不要返回`https|http|ftp|sftp`或者`.*`
    sky96111
        31
    sky96111  
       2021-08-15 21:37:41 +08:00
    @SingeeKing 对于英语是第一语言的人确实简单了
    SingeeKing
        32
    SingeeKing  
       2021-08-15 23:19:17 +08:00
    @sky96111 #31 我的感觉一直是自然语言做确定性表达反而会更难受,因为很容易就「自己加戏」然后造成异常
    discrete
        33
    discrete  
       2021-08-16 04:40:57 +08:00
    d7sus4
        34
    d7sus4  
       2021-08-16 08:51:30 +08:00
    就是预定义规则呗, 顶多加个组合规则.
    易用性和通用性本来就是冲突的, 要想完全自定义规则, 就自己去学正则, 正则真的够好写够简洁了(只是不好读而已).
    aloxaf
        35
    aloxaf  
       2021-08-16 09:15:46 +08:00   ❤️ 1
    @shihira grex 、regexgen

    但通过 https http ftp sftp 推断出 .*tps? 是不可能的,两者范围相差太大了
    raptor
        36
    raptor  
       2021-08-16 09:24:26 +08:00   ❤️ 2
    这玩意儿简单了功能就弱了,没什么意思,还不如 RE 一把梭。反正比它强的比它更复杂,比它简单的又没它强。
    sky96111
        37
    sky96111  
       2021-08-16 11:13:39 +08:00 via Android
    @SingeeKing 其实秉持着最简化祈使句就不容易「自己加戏」了,程序只需要做好一些同义词替换
    Stain5
        38
    Stain5  
       2021-08-16 13:44:06 +08:00
    英语在国内要达到 IELTS 8866 才能考虑移民,不然出去了你也无法融入
    secondwtq
        39
    secondwtq  
       2021-08-17 22:08:34 +08:00
    Parser Combinator
    不仅简单,还不比正则弱。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1482 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:53 · PVG 07:53 · LAX 15:53 · JFK 18:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.