正则匹配的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

时间: 2024-08-24 12:34:14

正则匹配的test函数的相关文章

java match正则匹配函数几个实例

java match正则匹配函数几个实例 match电话正则 public class main {   public static void main(string args[]) {     string phone = "(111)-111-1111";     string phonenumberpattern = "(d-)?(d{3}-)?d{3}-d{4}";     system.out.println(phone.matches(phonenumb

PHP 正则匹配中文

在做表单验证时对用户姓名的验证规则有以下要求 要求:输入的内容需要满足的条件是: 1.允许输入字符:数字(0-9).字母(a-z和A-Z).汉字.下划线(_).圆点(.)和空格: 2.姓名中间允许有空格: 3.下划线.圆点和空格均为英文状态输入法下的字符: 4.姓名前后不允许输入下划线.圆点.空格和特殊字符 $str = 'abc测试 ef'; if (preg_match('/^[a-zA-Z0-9\u4e00-\u9fa5]+$|^[a-zA-Z0-9\u4e00-\u9fa5][a-zA-

通过PHP自带的服务器来查看正则匹配结果的方法_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

迅雷地址正则匹配代码

迅雷地址正则匹配代码 thunder://[a-za-z0-9]* perl: thunder://.+ 用preg_replace()函数. 迅雷地址分不分大小写?不分的话用pregi_replace()

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

代码-关于PHP正则匹配table

问题描述 关于PHP正则匹配table PHP正则抓取第二个table中的html代码该怎么做 解决方案 直接字符串查找就可以了. 解决方案二: $res = preg_match_all('| (.*)</table>|U'$html$match);$match[1][1];//就是第二个table中的html数据 解决方案三: 直接查找字符串更简单. 解决方案四: , 两个位置索引之间的字符串就是你需要的

正则表达式-菜鸟求助:关于python的正则匹配问题?

问题描述 菜鸟求助:关于python的正则匹配问题? pattern = re.compile(word.join(['.?' '.?']))这个是什么意思啊?功能目的是什么啊?看了好几圈了,还是不懂,求大神帮忙 解决方案 给word字符串添加'.?.?',生成一个最终的字符串作为正则表达式的pattern 解决方案二: pattern 是正则匹配规则,你DEBUG看看pattern值是多少 就知道正则的匹配规则了

正则验证-java 正则匹配数据中的金钱数字

问题描述 java 正则匹配数据中的金钱数字 A文件数据:1001分店20121231,元旦之际祝您新年快乐身体健康万事如意.您共欠担保公司¥103959.50元.请您尽快偿还欠款,以免扩大损失.您的借款已逾期6天,欠款金额为1988.20元,逾期将影响信用记录,请即刻缴纳.截止 2015年07月01日 您应还金额为:4128元.如有疑问,请联系王先生1101101010.你好,截至到昨天夜里23:59,你欠款34532.32元,请您尽快偿还欠款,以免扩大损失.你好,截至到昨天夜里23:59,你

截取特定头部及尾部标签内匹配的内容函数

截取特定头部及尾部标签内匹配的内容函数,通常用于小偷程序. Public Function CutFixContent(ByVal str, ByVal start, ByVal last, ByVal n)Dim strTempOn Error Resume NextIf InStr(str, start) > 0 ThenSelect Case nCase 0  '左右都截取(都取前面)(去处关键字)strTemp = Right(str, Len(str) - InStr(str, sta