(^( )?(if|for|else|switch|case|break|{|}))(.*)?这个正则什么意思?

1.我不太理解第一个问号前面是匹配什么的?以空格开头?这个正则功能是用来匹配js的那几个关键词的,但是我不知道这么写的原理,原文链接在这里传送门

阅读 2.3k
1 个回答

看这个例子,模板引擎的语法应该是类似于这种:<%%>,在<%的后面和%>的前面可以没有空格,也可以有一个空格,比如<%name%><% name %>应该被认为是一样的,所以为了满足这个需求,前面需要添加一个( )?( )表示匹配一个空格,?表示前面的重复0到1次,所以( )?的意思就是说可以有一个空格,也可以没有。

结合代码,里面有两个正则:

var re = /<%([^%>]+)?%>/g,
    re2 = /(^( )?(if|for|else|switch|case|break|{|}))(.*)?/g;
...
while (match = re.exec(tpl)) {
    add(tpl.slice(cursor, match.index));
    re2.test(match[1]) ? add(match[1], true) : add("this." + match[1], true);
    cursor = match.index + match[0].length;
}

第一个正则会匹配<%%>然后把<%%>之间的内容保存下来,第二个正则正好会处理第一个正则保存下来的内容。
while循环中,首先用第一个re去匹配(match = re.exec(tpl)),然后<%%>之间的内容被保存在match[1]中,然后用re2去匹配(re2.test(match[1]))。
注意,re<%%>之间的内容全部放在match[1]中了,所以如果是<%name%>那么match[1]中的就是"name",但是如果是<% name %>那么match[1]中的就是" name ",所以需要使用( )?来处理一下空格。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题