正则匹配的test函数

var fnTest = /xyz/.test(function(){xyz;}) ? /b_superb/ : /.*/;对于其中正则表达式匹配函数test的用法,我很是迷惑:
/xyz/.test(function(){xyz;})我查阅了Mozilla developer center中关于test函数的描述:
Executes the search for a match between a regular expression and a specified string. Returns true or false.
字符串中是否有匹配正则表达式的子字符串。返回true或false。
其语法格式:
regexp.test([str])注意这里的参数是字符串,根本没有提到test函数的参数可以是函数的说法。
我试着修改这段奇怪的代码,得到了一些运行结果:


代码如下:

/xyz/.test("xyz"); // true
/xyz/.test(function(){"xyz";}); // false
/xyz/.test(function(){return "xyz";}); // true
/xyz/.test(function(){return xyz;}); // true
/xyz/.test(function(){return axyz;}); // true
/xyz/.test(function(){return "axyz";}); // true
/xyz/.test(function(){return "xayz";}); // false怎么回事?

华丽的分割线
=======================================
我终于知道了,却原来在test内部进行了类型转换,下面代码:


代码如下:

/xyz/.test(function(){xyz;});

等价于:


代码如下:

/xyz/.test((function(){xyz;}).toString());

又等价于:


代码如下:

/xyz/.test("function(){xyz;}");

那么为什么下面的代码返回false呢?


代码如下:

/xyz/.test(function(){"xyz";});

我们执行下这行代码就知道了:


代码如下:

// 这行代码的执行结果是:"function(){}"
(function(){"xyz";}).toString();

所以我们可以写出更加诡异的代码来迷惑大家了


代码如下:

/function/.test(function(){}); // true
// b 表示文字边界(对英文而言的)
/b_superb/.test(function(){this._super();}); // true

(0)

相关推荐

  • 正则匹配的test函数

    var fnTest = /xyz/.test(function(){xyz;}) ? /b_superb/ : /.*/;对于其中正则表达式匹配函数test的用法,我很是迷惑: /xyz/.test(function(){xyz;})我查阅了Mozilla developer center中关于test函数的描述: Executes the search for a match between a regular expression and a specified string. Retur

  • Python3正则匹配re.split,re.finditer及re.findall函数用法详解

    本文实例讲述了Python3正则匹配re.split,re.finditer及re.findall函数用法.分享给大家供大家参考,具体如下: re.split re.finditer re.findall @(python3) 官方 re 模块说明文档 re.compile() 函数 编译正则表达式模式,返回一个对象.可以把常用的正则表达式编译成正则表达式对象,方便后续调用及提高效率. re 模块最离不开的就是 re.compile 函数.其他函数都依赖于 compile 创建的 正则表达式对象

  • Android 手势 正则匹配图片实例代码

    为没有手势的控件(ViewFlipper) 添加手势 xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools

  • Python时间的精准正则匹配方法分析

    本文实例讲述了Python时间的精准正则匹配方法.分享给大家供大家参考,具体如下: 要用正则表达式精准匹配时间,其实并不容易 方式一: >>> import re >>> t = '19:10:48' >>> m = re.match(r'(.*):(.*):(.*)', t) >>> m.groups() ('19', '10', '48') 方式二: >>> t = '19:10:48' >>>

  • 通过PHP自带的服务器来查看正则匹配结果的方法

    众所周知,PHP代码需要web服务器来执行,要测试PHP代码就得搭建一个web服务器,这就给我们平时学习带来了较多不便.不过好在PHP v5.4版本以后,PHP会自带一个功能简单的web服务器. 启动内置web服务器 首先,进入自定义的web文件夹,然后启动内置web服务器: cd ~/public_html php -S localhost:8000 端口号8000是自定义的,换成其他未使用端口均可. 启动后,控制界面如下所示: 测试内置服务器 在public_html文件夹下建立test.p

  • 详谈jQuery中的一些正则匹配表达式

    jQuery常用正则匹配表达式 //整数 "^-?[1-9]\\d*$", //正整数 "^[1-9]\\d*$", //负整数 intege2: "^-[1-9]\\d*$", //数字 num: "^([+-]?)\\d*\\.?\\d+$", //正数(正整数 + 0) num1: "^[1-9]\\d*|0$", //负数(负整数 + 0) num2: "^-[1-9]\\d*|0$&qu

  • PHP简单实现正则匹配省市区的方法

    本文实例讲述了PHP简单实现正则匹配省市区的方法.分享给大家供大家参考,具体如下: 省市区正则匹配 复制代码 代码如下: preg_match('/(.*?(省|自治区|北京市|天津市))+(.*?(市|自治州|地区|区划|县))+(.*?(区|县|镇|乡|街道))/', $address, $matches); 获得省市区数组 $address = '广东省深圳市南山区'; preg_match('/(.*?(省|自治区|北京市|天津市))/', $address, $matches); if

  • Python正则匹配判断手机号是否合法的方法

    正则表达式,又称正规表示式.正规表示法.正规表达式.规则表达式.常规表示法(英语:Regular Expression,在代码中常简写为regex.regexp或RE),是计算机科学的一个概念.正则表达式使用单个字符串来描述.匹配一系列匹配某个句法规则的字符串.在很多文本编辑器里,正则表达式通常被用来检索.替换那些匹配某个模式的文本. # 需求 # 定义一个函数,用于判断输入的手机号是否合法 # 并判断它的运营商 # 思路步骤: # 1.首先了解三大运营商的号段分布 # 2.获取用户输入内容 #

  • JS实现关键词高亮显示正则匹配

    html 和ajax 部分就不写了,只需将需要匹配的文字传进去就可以了 比如匹配后台传回的字符串data.content中的关键词:直接调用: data.content = highLightKeywords(data.content,keywords)即可 以下两个函数分辨是匹配1:匹配关键词words中每一个字符,2:匹配整个关键词words //高亮关键字 text =>内容 words:关键词 tag 被包裹的标签 //匹配每一个关键字字符 function highLightKeywo

  • python re正则匹配网页中图片url地址的方法

    最近写了个python抓取必应搜索首页http://cn.bing.com/的背景图片并将此图片更换为我的电脑桌面的程序,在正则匹配图片url时遇到了匹配失败问题. 要抓取的图片地址如图所示: 首先,使用这个pattern reg = re.compile('.*g_img={url: "(http.*?jpg)"') 无论怎么匹配都匹配不到,后来把网页源码抓下来放在notepad++中查看,并用notepad++的正则匹配查找,很轻易就匹配到了,如图: 后来我写了个测试代码,把图片地

随机推荐