regex-tuesday,每周二会出一道正则表达式的题目,本周的题目比较简单,如果你答出来了,可以留言,如果答不出来.可以看看我的答案和解释.下面内嵌了原题目页面.你要做的就是使用JavaScript正则字面量的写法/regex/i,来通过所有的测试用例.本周题目的具体要求是把用例中链接的Markdown写法替换成右侧的HTML,一共有两个文本框需要填写,左边的写替换正则,右边的写替换结果.相当于使用"xxoo".replace(/xx/,"oo").
查看答案
这个题目主要考察捕获分组和匹配URL的正则写法,懂不懂Markdown的语法并不重要,只需要观察用例.
首先根据第一个用例,写出最初的正则,一共有两个捕获分组(红色部分):
/\[(.+)\]\((.+)\)/ 替换为 <a href="$2">$1</a> //匹配情况7/17
第8个用例误匹配了,是因为使用了非法的协议,我们需要一个匹配URL的正则来替换.+,这个匹配URL的正则(红色部分)就不做讲解了:
/\[(.+)\]\((http:\/\/[A-Za-z0-9-]*(?:\.[A-Za-z-]*)+\/?)\)/ 替换为 <a href="$2">$1</a> //匹配情况13/17
倒数第三个用例误匹配了,是因为开头的l和后面的标记之间缺少空格,所以我们还需要添加一个匹配空格的正则,要么是空格要么就是字符串的开头(红色部分),并且匹配到的空格还要捕获到替换结果中:
/(\s|^)\[(.+)\]\((http:\/\/[A-Za-z0-9-]*(?:\.[A-Za-z-]*)+\/?)\)/ 替换为 $1<a href="$3">$2</a> //匹配情况15/17
最后一个用例和上面类似,在字符串尾部也需要一个这样的限制:
/(\s|^)\[(.+)\]\((http:\/\/[A-Za-z0-9-]*(?:\.[A-Za-z-]*)+\/?)\)(\s|$)/ 替换为 $1<a href="$3">$2</a>$4 //匹配情况16/17
倒数第二个用例误匹配了,匹配标记的正则改一下,替换原来的.+:
/(\s|^)\[([^[]+)\]\((http:\/\/[A-Za-z0-9-]*(?:\.[A-Za-z-]*)+\/?)\)(\s|$)/ 替换为 $1<a href="$3">$2</a>$4 //匹配情况17/17