有没有比“正则表达式” 更简单直观的匹配技术? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
James369
V2EX    程序员

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

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

    我现在有个小需求:
    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  
    PRO
       2021-08-15 16:08:32 +08:00 via iPhone   1
    @kilasuelika 这东西哪里 simple 了… 觉得学这套语法还不如直接去学正则更快一点。。。
    lovelive1024
        22
    lovelive1024  
       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  
    PRO
       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     Solana     5519 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 32ms UTC 07:32 PVG 15:32 LAX 00:32 JFK 03:32
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86