V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
smartdie
V2EX  ›  正则表达式

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

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

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

    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:"v2ex.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   ·   实用小工具   ·   3692 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 04:18 · PVG 12:18 · LAX 20:18 · JFK 23:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.