Javascript正则表达式功能

Rus*_*ell 4 javascript

我已经花了几个小时在这上面,我似乎无法想出这个.

在下面的代码中,我试图准确理解正则表达式的url.match工作原理和方式.

由于代码如下,它不起作用.但是,如果我删除(?:&toggle=|&ie=utf-8|&FORM=|&aq=|&x=|&gwp)它似乎给了我想要的输出.

但是,我不想在不了解它正在做什么的情况下删除它.

我找到了一个非常有用的资源,但几个小时后我仍无法准确确定这些表达式的作用:

https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Regular_Expressions#Using_Parenthesized_Substring_Matches

有人可以为我解决这个问题并解释它是如何解析字符串的.表达本身和括号的位置对我来说并不是很清楚,坦率地说非常混乱.

任何帮助表示赞赏.

(function($) {    

  $(document).ready(function() {         

      function parse_keywords(url){
          var matches = url.match(/.*(?:\?p=|\?q=|&q=|\?s=)([a-zA-Z0-9 +]*)(?:&toggle=|&ie=utf-8|&FORM=|&aq=|&x=|&gwp)/);
          return matches ? matches[1].split('+') : [];

      }
      myRefUrl = "http://www.google.com/url?sa=f&rct=j&url=https://www.mydomain.com/&q=my+keyword+from+google&ei=fUpnUaage8niAKeiICgCA&usg=AFQjCNFAlKg_w5pZzrhwopwgD12c_8z_23Q";

      myk1 = (parse_keywords(myRefUrl));

      kw="";

      for (i=0;i<myk1.length;i++) {
          if (i == (myk1.length - 1)) {
          kw = kw + myk1[i];
          }
          else {
          kw = kw + myk1[i] + '%20';
          }
      }

      console.log (kw);

      if (kw != null && kw != "" && kw != " " && kw != "%20") {

      orighref = $('a#applynlink').attr('href');
      $('a#applynlink').attr('href', orighref + '&scbi=' + kw);
      }                     

  });  

})(jQuery);
Run Code Online (Sandbox Code Playgroud)

Pat*_*shu 5

让我们打破这个正则表达式.

/
Run Code Online (Sandbox Code Playgroud)

开始正则表达式.

.*
Run Code Online (Sandbox Code Playgroud)

匹配零或更多 - 基本上,我们愿意将此正则表达式随时匹配到字符串中.

(?:\?p=
|\?q=
|&q=
|\?s=)
Run Code Online (Sandbox Code Playgroud)

在这方面,?:手段"不捕获这个群体内的任何东西".见http://www.regular-expressions.info/refadv.html

\?方法需要?从字面上看,这通常是一个汉字意为"匹配前面的标识0或1份",但我们想匹配的实际?

除此之外,它只是寻找多种不同的选项(|意思是"如果我匹配我之前或之后的正则,那么正则表达式是有效的.")

([a-zA-Z0-9 +]*)
Run Code Online (Sandbox Code Playgroud)

现在我们在任何排列中匹配以下任何字符中的零个或多个:a-ZA-Z0-9 +并且因为它在一个内部()没有?:我们DO捕获它.

(?:&toggle=
|&ie=utf-8
|&FORM=
|&aq=
|&x=
|&gwp)
Run Code Online (Sandbox Code Playgroud)

我们看到另一个,?:所以这是另一个非捕获组.除此之外,它只是由|s 分隔的文字字符,所以它没有做任何奇特的逻辑.

/
Run Code Online (Sandbox Code Playgroud)

结束正则表达式.

总之,这个正则表达式查看第一个非捕获组的任何实例的字符串,捕获其中的所有内容,然后查找第二个非捕获组的任何实例以"封顶"它并返回这两个之间的所有内容非捕获组.(把它想象成一个"三明治",我们寻找页眉和页脚,捕捉我们感兴趣的所有内容)

正则表达式运行后,我们这样做:

回归比赛?匹配[1] .split('+'):[];

它抓取捕获的组并将其拆分+为一个字符串数组.