为什么人们要捍卫regex语法?

为什么人们要捍卫regex语法?,regex,syntax,Regex,Syntax,这里有一个类似的问题,但它只是得到了人们通常给出的关于正则表达式语法的老答案,但这不是这里的重点,所以请不要下意识地重复关于正则表达式语法的老答案。这次试着对它更具独创性和个人色彩 正则表达式语法非常紧凑,几乎太紧凑而不好用。就像打高尔夫一样, 每个人都同意代码高尔夫不是生产代码中的一件好事。然而,大多数人接受正则表达式语法,这似乎。。。至少可以说是矛盾的 因此,现在人们可能会听到一些常见的辩护理由包括: 回答:它很紧凑 计数器:在这个时代,我们不是都同意代码应该是可读的,像“client”这

这里有一个类似的问题,但它只是得到了人们通常给出的关于正则表达式语法的老答案,但这不是这里的重点,所以请不要下意识地重复关于正则表达式语法的老答案。这次试着对它更具独创性和个人色彩

正则表达式语法非常紧凑,几乎太紧凑而不好用。就像打高尔夫一样, 每个人都同意代码高尔夫不是生产代码中的一件好事。然而,大多数人接受正则表达式语法,这似乎。。。至少可以说是矛盾的

因此,现在人们可能会听到一些常见的辩护理由包括:

  • 回答:它很紧凑

  • 计数器:在这个时代,我们不是都同意代码应该是可读的,像“client”这样的变量比“c”更好吗

  • 答:这是一种“领域特定语言”

  • 计数器:那么所有非常容易理解、不紧凑、不神秘并且我敢说是漂亮的领域语言,比如SQL或LINQ,又如何呢

  • 回答:一旦你知道了,就很容易理解

  • 计数器:大多数伟大的语言都很容易理解,即使你以前从未使用过它们。例如,任何人都可以很容易地跳入Python,即使他们以前从未见过Python。为什么人们会在Regex语言如此难以理解的时候为它辩护,然后继续抱怨Lisps括号呢

好了,现在大家都试着保持原创性和诚实,不要只是重复20年前程序员用来设计正则表达式的老生常谈。除非你真的相信它们在当今时代是有效的


编辑:记录在案,我从几年前就知道正则表达式,即使在今天也经常使用它们,甚至可能会尝试使用它们。然而,我突然有一种感觉,也许是时候重新考虑我认为关于regex的“真理”了,并从现代的角度看待它们。主要是因为质疑原则是进一步发展的必要条件,而且因为很多新来者抱怨他们,他们不能仅仅是正确的,所以我决定尝试进入新的人的鞋子,并考虑什么是对正则表达式的一些优点。 至于主观方面,我不认为这比当时的程序员笑话更主观或与程序员相关。相反,它与程序员非常相关

至于辩论性的,这就是问题的重点。为了得到好的论据,赞成和反对正则表达式过时的语法,这可以帮助新来者更好地理解为什么正则表达式是这样的,甚至更好地希望让一些新来者想出一个更好的解决方案,因为我们被正则表达式的“酷”蒙蔽了双眼


引用:

Perl 5.10文档 正则表达式已经融化成一堆 因为有那么多滑稽的东西,所以无法读懂 功能已经逐渐进入语法 没有人能写得明智 关于它的文档


你是想说正则表达式已经无法维护了?那么,作为优秀的程序员,我们应该考虑重构它们吗?也许像我们使用其他许多技术一样进行清理和重新尝试?

regex的另一个问题是它有很多味道。Net正则表达式与php正则表达式与其他正则表达式看起来都很相似,但结果并不相同(有时根本没有结果)。

看看问题的另一面:如何设计一种新的语法,它体现了正则表达式的所有特性、一致性、简洁性和健壮性,但对程序员更友好?

它可以工作

如果有一种易于阅读的语言,它在每一种主要编程语言中都有扩展,并且经过良好的文档记录和测试,没有正则表达式那样压缩,但也不太冗长(verbose=烦人),那么我想了解更多关于它的信息,我会为正则表达式语法辩护,因为它(粗略地说)匹配我在学习算法与机器课程时所学的符号。这是一种生成机器以接受指定规则语言的简单方法


正则表达式语法就是这样的,因为它确实是您需要完全描述您所寻找的行为的全部

就像亚当说的,还有更好的吗?一想到要做一堆strcmp操作而不是一个好的正则表达式,我就不寒而栗。与任何表达性语言一样,可能会滥用正则表达式并生成非常不可读的结构,但通常即使是看似不可读的正则表达式也比等效的过程代码更有意义来实现相同的功能

如果没有正则表达式,您必须编写自己的例程来解析、回溯、比较、存储索引、进行替换和管理所有结果。正则表达式以一种非常有表现力的形式提供了所有这些。我不喜欢重复代码,但如果每次我需要寻找一个中等复杂的模式时都必须编写自己的解析器。。。我不知道我会怎么做


是的,正则表达式有不同的风格,但大多数最流行的正则表达式都非常相似,而且无论您在何种语言中使用它们,通常都会有文档帮助您阅读它。

您应该将正则表达式视为高端电动工具(我指的是建筑行业意义上的电动工具)

如果你正在为你的棚子搭建一个小工作台,你不会拔出射钉枪、电锯和工业路由器。你用锯子,钉子和锤子

类似地,如果没有起重机,你不会建造一栋30层的建筑

想法是为工作使用合适的工具,为你的技能水平使用合适的工具

如果你必须砍倒一棵树,在你启动电锯之前,确保你知道所有关于回扣的事情。如果你不这样做,那么就用手锯代替,省得去医院重新连接断肢

我用雷古
<TAG\b[^>]*>(.*?)</TAG>
from pyparsing import Word, alphas
greet = Word( alphas ) + "," + Word( alphas ) + "!"
greet.parseString("Hello, World!")
    use Regexp::English;

    my $re = Regexp::English
            -> start_of_line
            -> literal('Flippers')
            -> literal(':')
            -> optional
                    -> whitespace_char
            -> end
            -> remember
                    -> multiple
                            -> digit;

    while (<INPUT>) {
            if (my $match = $re->match($_)) {
                    print "$match\n";
            }
    }