3

我正在研究 JavaScript(使用专业 Javascript for Web Developers [1]),我想知道为什么开发人员可能会使用 RegExp 中的短名称而不是语义上更有意义的详细名称(即“$_”而不是 input 或“$ `" 而不是 leftContext)?

在我需要查找短名称(或者甚至,我假设,通过代码完成)的时间里,我可以轻松地输入详细名称。但是,如果它们很重要,我不想吹掉它们,那么为什么程序员更喜欢短名称呢?

谢谢你。

编辑:

一些上下文。书中给出了以下示例:

var text = "this has been a short summer"; 
var pattern = /(.)hort/g; 

 if (pattern.test( text)){ 

   alert( RegExp.input);                     // this has been a short summer 
   alert( RegExp.$_);                        // this has been a short summer 

   alert( RegExp.leftContext);               // this has been a 
   alert( RegExp.["$`"]);                    // this has been a 

   alert( RegExp.rightContext);              // summer 
   alert( RegExp.["$'"]);                    // summer 

   alert( RegExp.lastMatch);                 // short 
   alert( RegExp.["$&"]);                    // short 

   alert( RegExp.lastParen);                 // s 
   alert( RegExp.["$+"]);                    // s 

  }

如果甚至不推荐使用这些冗长的形式,那么我想我的问题会略有不同(“没有它们,您将如何完成这些任务?”)。

1:扎卡斯,尼古拉斯 C. (2011-12-20)。面向 Web 开发人员的专业 JavaScript。约翰威利父子。

4

3 回答 3

0

它们具有以前的模式,因为我相信这就是它们在其他语言(例如 Perl)中的模式,因此如果您的背景使用不同的语言,就会有那种熟悉感。

它们只能用于替换字符串,例如"ABC".replace(/[ABC]/g, "$&").

于 2013-04-03T04:12:44.097 回答
0

套用 Perl Camel 的书,有些情况您要强调“快速而肮脏”并节省开发时间,有些情况您要强调可维护性。如果您只需要快速破解来完成工作,那么您无需查找即可记住的任何内容都比您通常想要编写的漂亮的、人类可读的、自记录的代码要快。套用一句不同的格言,对于第一个原型,一旦你可以让基本流程正常工作,你就打算回来进行润色,在你投入任何努力“让它正确”之前,你想“让它工作”。

(当然,这种推理很容易回头咬你,但这就是推理。)

于 2013-04-03T04:19:02.463 回答
0

看起来RegExp.["$`"]RegExp.["$'"]已经“死”了,RegExp.$+而且RegExp.$&行为出人意料。

当前(2015 年 4 月 30 日)输出:

RegExp.input : 这是一个短暂的夏天
RegExp.$_ : 这是一个短暂的夏天
RegExp.leftContext : 这是一个
RegExp.rightContext : 夏天
RegExp.lastMatch : short
0
RegExp.lastParen : s
RegExp.$+ :未定义的NaN

这是一个现场测试:

var text = "this has been a short summer"; 
var pattern = /(.)hort/g; 



 if (pattern.exec(text) != null) {

   document.getElementById("res").innerHTML += "<b>RegExp.input</b>: " + RegExp.input + "<br />";               // this has been a short summer 
   document.getElementById("res").innerHTML += "<b>RegExp.$_</b>: " + RegExp.$_ + "<br />";                  // this has been a short summer 
   
   document.getElementById("res").innerHTML += "<b>RegExp.leftContext</b>: " + RegExp.leftContext + "<br />";       // this has been a 
   //document.getElementById("res").innerHTML += RegExp.["$`"] + "<br />";            // this has been a, now, does not let compile

   document.getElementById("res").innerHTML += "<b>RegExp.rightContext</b>: " + RegExp.rightContext + "<br />";    // summer 
   //document.getElementById("res").innerHTML += RegExp.["$'"] + "<br />";           // summer, now, does not let compile

   document.getElementById("res").innerHTML += "<b>RegExp.lastMatch</b>: " + RegExp.lastMatch + "<br />";           // short 
   document.getElementById("res").innerHTML += "<b>RegExp.$&</b>: " + RegExp.$& + "<br />";                  // was "short", now, evaluates the expression on the right to 0

   document.getElementById("res").innerHTML += "<br /><b>RegExp.lastParen</b>: " + RegExp.lastParen + "<br />";          // s 
   document.getElementById("res").innerHTML += "<b>RegExp.$+</b>: " + RegExp.$+ + "<br />";                 // was "s", now, outputs "NaN"

  }
<div id="res" />

于 2015-04-30T13:58:06.383 回答