Javascript正则表达式功能

时间:2013-04-12 00:53:37

标签: 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);

2 个答案:

答案 0 :(得分:5)

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

/

开始正则表达式。

.*

匹配零个或多个任何东西 - 基本上,我们愿意将此正则表达式随时匹配到字符串中。

(?:\?p=
|\?q=
|&q=
|\?s=)

在此,?:表示“不捕获此组内的任何内容”。见http://www.regular-expressions.info/refadv.html

\?表示从字面上取?,这通常是一个字符,意思是'匹配前一个令牌的0或1个副本'但我们想要匹配实际的?。

除此之外,它只是在寻找多种不同的选项(|意味着'正则表达式是有效的,如果我匹配在我之前或在我之后的那些。)

([a-zA-Z0-9 +]*)

现在我们在任何排列中匹配以下任何字符中的零个或多个:a-ZA-Z0-9 +因为它位于()内,没有?:,我们会捕获它。

(?:&toggle=
|&ie=utf-8
|&FORM=
|&aq=
|&x=
|&gwp)

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

/

结束正则表达式。

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

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

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

抓取捕获的组并将其+拆分为字符串数组。

答案 1 :(得分:4)

对于这样的情况,用www.debuggex.com(我建立的)可视化它真的很有用。它会立即显示正则表达式的结构,并允许您逐步完成。

在这种情况下,删除正则表达式的最后一部分时它的工作原因是因为所有字符串&toggle=&ie=utf-8等都不在您的示例网址中。要看到这一点,请将调色板上方的灰色滑块拖到debuggex上,您将看到它永远不会超过最后一组中的&