难道没有一种能替代正则表达式的方法吗? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
smartdie
V2EX    正则表达式

难道没有一种能替代正则表达式的方法吗?

  •  
  •   smartdie 2016-01-08 09:29:35 +08:00 3415 次点击
    这是一个创建于 3609 天前的主题,其中的信息可能已经有所发展或是发生改变。

    正则表达式三大缺点:难记,难写(容易出错),难读(基本没有可读性)。
    写的时候很容易匹配出错,读别人写的表达式也非常困扰。
    这个世界上有那么多编程语言,难道没人发明一种更易用的字符匹配方法吗?

    28 条回复    2016-01-08 19:17:04 +08:00
    gimp
        1
    gimp  
       2016-01-08 09:35:14 +08:00   2
    然后你会发现为了完成类似的功能,最后又都成为了变种的正则表达式
    Moker
        2
    Moker  
       2016-01-08 09:41:09 +08:00   2
    https://github.com/VerbalExpressions/PHPVerbalExpressions
    你是需要这个么?不过最终都和楼上所说的
    xream
        3
    xream  
       2016-01-08 09:46:17 +08:00   2
    amaranthf
        4
    amaranthf  
       2016-01-08 09:46:33 +08:00   1
    你所说的难记难写难读其实是一件事情,就是因为使用了很多无法直接理解含义的符号,如^ [] \X 等,另外就是因为使用了很多符号,那么遇到原本的符号就需要转义,会更加的难以阅读。
    那么你想怎么做呢?
    全部使用同一种符号,比如
    ^变成\not() []变成\set()?
    或者……
    写个(if cond case1 case2)?
    反正我是想象不出什么更好的表达方式。
    smartdie
        5
    smartdie  
    OP
       2016-01-08 09:49:07 +08:00
    @gimp 这点我也理解,就像所有语言,都有个进阶的概念。对于一般匹配需求,能够快速看懂并解决问题是最好的,对于更复杂深入的匹配,需要复杂的手段。而正则表达式是个很容易犯错的东西,即使我用这么久,还是偶尔匹配出错。
    imn1
        6
    imn1  
       2016-01-08 09:56:46 +08:00
    start-with:"http",no-more-than-one:"s",follow-string:"://",no-more-than-one:"www.",follow-string:"v2e.com"……
    这样好读
    gimp
        7
    gimp  
       2016-01-08 10:01:21 +08:00   1
    所以不到万不得已,尽量避免使用正则

    这类的辅助工具也能减少出错的概率

    http://tool.oschina.net/regex

    http://regexper.com/#%5E%5B1-9%5D%5Cd*%5C.%5Cd*%7C0%5C.%5Cd*%5B1-9%5D%5Cd*%24
    dallaslu
        8
    dallaslu  
       2016-01-08 10:02:18 +08:00
    其实多花些功夫,正则表达式没有想象中的难记、难写、难读。

    1. 网络上有很多常用正则表达式语句的资源,正则语法也是一小篇手册就能说清的;
    2. 先不处理过多的判断逻辑,逐步完善,写起来也应该是行云流水;
    3. 对正则了解得稍深入一些的话,就知道可以在表达式里面写注释、组名,甚至还有一些第三方的图形解析正则的工具,可以帮助理解正则中的复杂的业务判断逻辑。
    shyling
        9
    shyling  
       2016-01-08 10:13:41 +08:00 via iPad
    不觉得正则难记难写难读啊。。
    swsh007
        10
    swsh007  
       2016-01-08 10:16:13 +08:00
    没觉得啊,好用就可以了。
    ethego
        11
    ethego  
       2016-01-08 10:21:04 +08:00
    正则我觉得是最好读的,简洁明了,只要你知道它的规则,根本没有歧义
    jiyinyiyong
        12
    jiyinyiyong  
       2016-01-08 10:26:40 +08:00   1
    听说 Perl6 重新发明了正则... 不知道有没有变好用点
    shangjiyu
        13
    shangjiyu  
       2016-01-08 10:56:41 +08:00 via iPhone
    有语意化的裤
    babyhome
        14
    babyhome  
       2016-01-08 11:00:43 +08:00 via iPhone   1
    说到底还是功力不够
    Perry
        15
    Perry  
       2016-01-08 11:06:45 +08:00
    如果要易懂,那么必定会 trade off 简洁性,写一个规则可能会用上几行代码。
    zhouyg
        16
    zhouyg  
       2016-01-08 11:08:25 +08:00
    最后发现,还是正则最方便,最简洁。
    smartdie
        17
    smartdie  
    OP
       2016-01-08 11:19:52 +08:00
    @babyhome 你站在使用工具的人视角说的也没错,我是站在发明工具的人的视角探讨这件事
    gamexg
        18
    gamexg  
       2016-01-08 11:20:30 +08:00
    同意 1L ,实现相同的痛能最后又会变得和正则一样复杂。
    理解后正则难度也不大,就是一段时间不用就忘个差不多,又需要看手册。

    配合好工具写正则、读正则都很简单。楼上有网页版的正则工具,不过我一般用 Regex Match Tracer ,国产的本地免费正则软件。
    slixurd
        20
    slixurd  
       2016-01-08 11:29:56 +08:00
    正则表达式本质上是一个 DFA ,想要能够描述和匹配所有的字符串,最后还是会变成正则。
    语言层面能做简单的语法糖,不过其实对于已经被广泛接受的正则,并没有什么优势。
    bitbegin
        21
    bitbegin  
       2016-01-08 11:31:51 +08:00
    都没人提 [red][www.red-lang.org] parse 么(或者 rebol parse )?

    parse "http://www.v2ex.com" rule: ["http" opt #"s" "://" opt "www." "v2ex.com"]

    感觉这个用着很好用。。。
    zhangbohun
        22
    zhangbohun  
       2016-01-08 11:46:58 +08:00
    正则表达式的语法太抽象,因为字符越少越方便写,但是语法的逻辑还是很简单的。
    jin5354
        23
    jin5354  
       2016-01-08 11:56:43 +08:00
    正则已经足够简单明了了
    你想要易读,反正无非是上语法糖,最终效果也许还不如之前的
    polythene
        24
    polythene  
       2016-01-08 13:04:36 +08:00
    @babyhome 复杂的正则到最后看起来都像天书一样,这跟功底没有多大关系。

    正则语法设计的可读性很差,为什么一直没有人肯承认呢。我非常佩服 JS 的作者,他就承认 JS 当年没设计好。
    kn007
        25
    kn007  
       2016-01-08 13:29:04 +08:00
    正则其实算是简单明了的了。
    无论那种方式,最后到最后其实都是正则。。。

    或许你需要类似这种东东来帮忙?

    https://github.com/VerbalExpressions/PHPVerbalExpressions
    Mutoo
        26
    Mutoo  
       2016-01-08 13:48:39 +08:00
    正则表达式实质就是状态机的文本描述。再搞一套状态机,到头来还是正则表达式的方言而已。
    em70
        27
    em70  
       2016-01-08 13:55:50 +08:00
    正则的问题在于总想一句话解决问题,这样必须要以复杂性为代价

    其实文本分析只需要 2 个函数
    1.提取两个指定字符串之间的内容
    2.提取全文里两个指定字符串之间的所有内容

    就足够分析任意结构的文本了
    xmbaozi
        28
    xmbaozi  
       2016-01-08 19:17:04 +08:00
    http://www.baozy.com/archives/12362.html
    30 分钟入门

    这篇看一遍,基本都会写了,一段时间可以可以脱离手册
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     4353 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 00:15 PVG 08:15 LAX 16:15 JFK 19:15
    Do have faith in what you're doing.
    ubao msn 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