为什么人们会捍卫正则表达式的语法?

Rob*_*uld 10 regex syntax

有一个类似的问题,但它只是得到了人们总是给出的关于正则表达式语法的旧答案,但这不是重点,所以请尽量不要扯下有关正则表达式语法的旧答案.这一次尝试变得更加原创和个性化.

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

所以现在可能听到的一些常见防御包括:

  • :它很紧凑

  • 专柜:在这个时代我们是否都同意代码应该识字并且像"客户"这样的变量比"c"更好?

  • :这是一种"领域特定语言"

  • 反击:所有非常容易理解的,非紧凑的,非神秘的,我敢说那些像SQL或LINQ那样漂亮的域语言怎么样?

  • :一旦你知道它就很容易理解.

  • 专柜:即使您以前从未使用过,大多数优秀的语言也很容易理解.例如,任何人都可以很容易地跳入Python,即使他们以前从未见过它.为什么人们在看到如此难以理解的语言时会捍卫正则表达式,然后再继续抱怨Lisps括号?

好的,现在每个人都试图在这里做原创和诚实,不要只是拉出20年前使用的程序员设计正则表达式的旧的死记硬背答案.除非你真的相信它们在这个时代是有效的命题.


编辑:为了记录,我知道多年前的Regex,即使在今天也经常使用它们,甚至可能会让它们搞砸.然而,我突然有一种感觉,也许是时候重新考虑我所采取的关于正则表达的"真理"的事情,并从现代的角度来看待它们.主要是因为提问原则对于进一步发展是必要的,并且因为很多新人对他们抱怨很厉害,他们不能正确地说出来,所以我决定尝试进入一个新人的角度并考虑一些好处反对正则表达式.

至于主观,我认为这不是主观的,也不是程序员相关的程序员相关的日常事物.相反,它与程序员有关.

至于议论性问题,这就是问题的关键所在.为了获得良好的论证pro和con regex过时的语法,这可以让新手真正了解为什么正则表达式是他们的,甚至更好的希望得到一些新人来提出一个更好的解决方案美国老头脑看不到因为我们被正则表达式的"冷静"所蒙蔽.


引用:

用于正则表达式的Perl 5.10文档已经融化成一堆不可读的文件,因为许多zany功能已经渗透到语法中,没有人可以为它编写合理的文档.

你试图说正则表达式已经变得无法维护了吗?那么作为优秀的程序员,我们应该考虑重构它们吗?也许我们已经完成了许多其他技术的清理和尝试?

he_*_*eat 34

我要说的大部分内容都是由Adam和DGM解决的,但我认为它们并不能很好地涵盖你的第二点.

"所有非常容易理解的,非紧凑的,非神秘的,我敢说那些像SQL或LINQ那样漂亮的领域语言怎么样?"

我想一个表达答案的好方法是问,你怎么用英语来解释正则表达式?

<TAG\b[^>]*>(.*?)</TAG>
Run Code Online (Sandbox Code Playgroud)

寻找"<TAG"一个单词边界为零或更多的不是'>'然后是'>'的东西记住零或更多的东西,停在第一个"</ TAG>"

这是一个相当简单的正则表达式.英文表格真的更容易理解吗?你能做得更好吗?

正则表达式很难阅读,但是你想要的东西也很难解释.

  • +1:好点."如果写得很难,就应该很难理解.为什么你认为他们称之为_code_!?" (5认同)
  • @RCIX只有你不知道正则表达式. (2认同)

Ada*_*iss 26

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


bri*_*foy 17

你的反驳论据似是而非.你知道正则表达式的语法,还是你从无知的角度进行争论?建立你的偏见是一个重要的观点.

  • 它完全不像代码打高尔夫球.我不确定你的关系.为什么不使用相同的参数抱怨指针或其他东西?

  • 正则表达式的紧凑性与不良变量名称无关.名为c的变量可以是任何东西.正则表达式语法既不模糊也不含糊.它准确地描述了它的模式.

  • 这是一个DSL.那怎么回事?你有没有试过在SQL中做复杂的事情?这也是一个很大的混乱.做同样的事情需要更多的打字和更多的语法并不能改善这种情况.我教的大多数人都有正则表达式的问题,因为他们不习惯于思考和设计模式,而不是因为语法是异国情调.

  • 一旦你知道它就很容易理解.嗯,确实如此.电动工具并未针对新手或不愿意学习的人进行优化.我不抱怨Lisp括号,但我不介意正则表达式语法.

如果您不想使用正则表达式,那么请不要.使用字符串操作函数或解析器.使用其他一些工具.当你忙着这件事的时候,我将面临十大问题,因为我不是在逆潮流,也不是把工具归咎于我无法完成的工作.

这取决于你想完成多少工作.找到最快到达那里的工具并学习它.如果你不喜欢这样,那就发明一些更好的东西.在此之前,停止抱怨.


Ada*_*iss 15

这实际上是美国退休程序员协会(American Association of Retired Programmers)对今天抨击Python和Java的年轻鞭挞者的阴谋.我们需要保持对神秘主义者的敬畏和敬意,他们的聪明才智克服了微小的核心记忆和具有3个字符助记符的神秘语言的挑战......并且喜欢它.上坡......两种方式......在雪地里.:-)


Ton*_*les 11

我会捍卫正则表达式语法,因为它(粗略地)与我在学习算法和机器课程时学到的符号相匹配.这是一种生成机器来摄取指定常规语言的简便方法.

正则表达式语法是这样的,因为它真的是你需要完全描述你正在寻找的行为.


Adi*_*rji 9

有用!!
如果有一种易于阅读的语言,在每种主要的编程语言中都有扩展,并且有很好的文档和测试,而不像正则表达式那样压缩,但是既不太冗长(冗长=烦人),我想知道更多关于它的信息


use*_*714 8

正则表达式的一些问题不是语言本身,而是人们尝试使用它们的原因.当他们真正想要的是一个相当简单的解析器时,他们将编写正则表达式的行和行.

正则表达式适用于简单到中等复杂的子字符串匹配和数据提取.但是在复杂的某些方面,你只需要编译编译器并编写一个真正的解析器.我想很多人都没有意识到正则表达式主要用于匹配,而不是用于解析.


Fre*_*rin 6

正则表达式的另一个问题是它有很多种类..Net正则表达式与php正则表达式与其他正则表达式相比,所有看起来都相似,但不会给出相同的结果(有时根本没有结果).

  • 这就是为什么我倾向于将正则表达式看作"不规则表达"...... (2认同)

pax*_*blo 6

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

如果你正在为你的棚子建造一个小工作台,你就不要拔出钉枪,电锯和工业路由器.你用锯子,钉子和锤子.

同样地,你不会在某处建造一座没有起重机的30层建筑.

我们的想法是要用于工作的工具为你的技能水平的工具.

如果你必须砍伐树木,在开始电锯之前确保你知道所有关于回扣的信息.如果你不这样做,那就用手锯代替自己去医院,重新连接断肢.

我用我的电锯的方式使用正则表达式 - 非常仔细.如果您对该工具不舒服,请不要使用它.一旦你学会了如何正确使用它,你会发现更快地完成工作要容易得多.


Mic*_*man 6

其他人已暗示这一点,但它明确说明:

常规语言与编程语言不同.他们更接近数学符号.

紧凑性和怪癖更多的是试图用ASCII字符强制精确的符号而不是故意的简洁或模糊的尝试.


Amb*_*pel 5

我认为类似SQL的正则表达式语言将是一个引人入胜的项目.我很乐意看到有人创造这个.

为什么不用一种可以写的语言

LOOK FOR "<TAG"

THEN WORDBOUNDARY THEN ZERO-OR-MORE NOT('>') FOLLOWED-BY '>'

THEN ZERO-OR-MORE SOMETHING REMEMBERED

THEN NEAREST "</TAG>"

我不确定谁是目标受众 - 我不认为我会使用它,因为我花了这么多时间学习正则表达式.

当然,那些需要使用复杂的表达方式的那些人几乎映射到那些必须处理复杂且更多日常事物的程序员?

  • 呃——抱歉,但这看起来很糟糕。我想说使用空格/注释语法,这样您就可以逻辑地将其拆分,并注释任何维护代码的人(包括一年后的您自己)可能会感到困惑的任何内容;) (2认同)
  • 用于英语到正则表达式翻译的自然语言解析器现已存在:https://www.autoregex.xyz/home (2认同)

Axe*_*man 5

类似于 BNF 符号等,是许多优秀语言规范的基础。因此,在词法分析器中使用这样的符号来指示预期字符的类别是有道理的。基本符号真的不是那么神秘。

然后我认为 UNIX-do-you-can-in-a-sing-line 的想法接管了。在 sed 和 grep 脚本改进之后,正则表达式获得了新的功能,但它们的速记表示法。Larry Wall 将它们合并到 Perl 中作为解析文本的通用工具。我猜它保留了对 perl 仍然很重要的 oneliner 的紧凑性。并且有常见字符类的速记名称,并且要求并赋予正则表达式更多的权力。当然,由于 Perl 也是一种模块语言,正则表达式语法也适用于语句块,并且它利用了更广为人知的语法。

将它们融入 Java 确实让人们看到了它们,IMO。Java 没有采取任何措施来容纳它们。结果,中等难度的反斜杠表达式变成了密集的反斜杠丛林。如果您愿意,Java 为正则表达式提供了一个新市场,但它是最残酷的形式。如果您已经看过这些并且没有再注意,您可能会认为正则表达式是一个不应该的东西。

有趣的是,如果有足够清晰的语法,对于 Ambrose 的冗长版本,有人可以为 Perl 提出一个模块,该模块可以采用冗长的正则表达式并将其“编译”为 Perl 理解的紧凑正则表达式,通过使用更简单的正则表达式overload::constants或可能的Parse::RecDescent语法.


Bra*_*don 5

Pyparsing(http://pyparsing.wikispaces.com/Examples)是一个Python库,可以很容易地编写高度可读的类似于regex的表达式,就像这些将解析"Hello,World!"的行一样:

from pyparsing import Word, alphas
greet = Word( alphas ) + "," + Word( alphas ) + "!"
greet.parseString("Hello, World!")
Run Code Online (Sandbox Code Playgroud)

看起来这个库非常接近能够匹配正则表达式的强大功能(参见上面提到的示例页面).