问题 JavaScript的正则表达式表示法有什么问题?


我正在阅读Douglas Crockford的网页, JavaScript:世界上最容易被误解的编程语言,我不禁注意到,在设计错误下,他提到了“字面正则表达式的符号”。究竟他在说什么? JavaScript的正则表达式表示法有什么问题,为什么?


12254
2018-06-20 06:35


起源



答案:


可能与它强迫你逃脱的事实有关 / 也许他想要一个更独特的角色用作符号。

/test// 是无效的,而 /test\// 是一个有效的正则表达式。

在某些语言中,您实际上可以在字符串中指定标记字符,例如:

$regex = '#test/#';

哪里 # 符号做指示。


9
2018-06-20 06:39



非常正确,可能就是这样。但除了PHP之外,哪些语言实际上允许你指定角色?我很难想到,但这可能只是因为我几乎没有使用正则表达式。 - Sasha Chedygov
是啊。 Crockford的抱怨是关于“超载”斜线角色,但我认为他的主要关注点是关于JS的超载(我认为!)。例如,如果您注释掉代码块 /*...*/ 你可以看到如果你试图评论会发生什么 /0x[0-9a-f]*/.test(strMyString); 接着就,随即。我曾经多次使用RegExp()方法创建正则表达式,因为文字容易出错。 - Andrew
@Andrew真的吗?我知道它是如何可能的,但我从未遇到过这种情况。 - Justin Johnson
@Justin你不太可能经常在现实生活中遇到这个问题,特别是如果你的IDE支持JS语法高亮。但是我已经遇到过几次这个特定的问题而且这真是令人头疼。在记事本的页面上注释掉所有JS,并看到它在几周内没有触及的工作代码上死亡。 “什么......?但这不是问题所在。而且这一切都被评出了!!”如果您将一些大型的,最小化的JS框架(如jQuery)嵌入到您的站点的代码库中然后将其注释掉(例如,看看它如何在没有jQuery的情况下加载),也可以保证发生这种情况。乐趣。 - Andrew
@musicfreak “流编辑”sed 基于正则表达式执行替换,并允许您为替换选择分隔符号。 - Christian Semrau


答案:


可能与它强迫你逃脱的事实有关 / 也许他想要一个更独特的角色用作符号。

/test// 是无效的,而 /test\// 是一个有效的正则表达式。

在某些语言中,您实际上可以在字符串中指定标记字符,例如:

$regex = '#test/#';

哪里 # 符号做指示。


9
2018-06-20 06:39



非常正确,可能就是这样。但除了PHP之外,哪些语言实际上允许你指定角色?我很难想到,但这可能只是因为我几乎没有使用正则表达式。 - Sasha Chedygov
是啊。 Crockford的抱怨是关于“超载”斜线角色,但我认为他的主要关注点是关于JS的超载(我认为!)。例如,如果您注释掉代码块 /*...*/ 你可以看到如果你试图评论会发生什么 /0x[0-9a-f]*/.test(strMyString); 接着就,随即。我曾经多次使用RegExp()方法创建正则表达式,因为文字容易出错。 - Andrew
@Andrew真的吗?我知道它是如何可能的,但我从未遇到过这种情况。 - Justin Johnson
@Justin你不太可能经常在现实生活中遇到这个问题,特别是如果你的IDE支持JS语法高亮。但是我已经遇到过几次这个特定的问题而且这真是令人头疼。在记事本的页面上注释掉所有JS,并看到它在几周内没有触及的工作代码上死亡。 “什么......?但这不是问题所在。而且这一切都被评出了!!”如果您将一些大型的,最小化的JS框架(如jQuery)嵌入到您的站点的代码库中然后将其注释掉(例如,看看它如何在没有jQuery的情况下加载),也可以保证发生这种情况。乐趣。 - Andrew
@musicfreak “流编辑”sed 基于正则表达式执行替换,并允许您为替换选择分隔符号。 - Christian Semrau


我可以想象正则表达式文字表示法是阻止正则表达式引擎与语言规范分离的障碍。

如果所有正则表达式都是字符串,则它们在语言级别始终有效,并且正则表达式引擎可以更自由地解释它们。

但这只是猜测。我不知道克罗克福德的陈述是什么意思。

就个人而言,我发现正则表达式文字相当有用。比起来的要简单得多 new RegExp(pattern, flags) 需要坚持正则表达式逃避的替代方案  字符串转义规则("Path\\\\with\\\\backslashes", 任何人?)。我无法看到巨大的利益 这个 符号,除了处理动态正则表达式。


1
2018-01-02 09:47





他真的不清楚分号插入是错误的意思。也许他将分号视为语句分隔符。如果是这样的话,我不同意。没有分号代码混淆器/缩小器不会在您的代码上运行。


0
2018-01-02 08:22



他对分号插入的抱怨是分号是“可选的”,因此插入。但问题是关于正则表达式文字的粗体部分,而不是分号插入。 - eyelidlessness
谢谢你的回答,但我特别询问了问题中加粗的部分。 - alex
我很困惑:)听起来像是对我的咆哮。作者只是在没有详细说明为什么他认为JavaScript设计不佳的情况下提出投诉。 - jmort253
@ jmort253,那件作品并不是特别好,但是Crockford是那里最知识渊博的ECMAScript布道者之一,并且在他对该语言进行的演讲中做了大量的阐述。几乎所有他的投诉都是有效的(他在“好的部分”中解释了这些内容,如果你感兴趣的话,值得查看),但有些是不合适的。 - eyelidlessness
分号=>看 stackoverflow.com/questions/1995113/strangest-language-feature/... - NoxArt


可能搞乱用于评论和分割的斜杠 这个 或者因为“它们应该是一行,没有空格或插入评论” 这个


0
2017-12-24 22:37