JS中给正则表达式加变量

2017-05-31 13:35:23

一、字面量

其实当我们定义一个字符串,一个数组,一个对象等等的时候,我们习惯用字面量来定义,例如:

var s = "string";

var a = [1,2];

var o = {};

 

 

如果需要加入变量,那也是十分简单的事情,比如:

var v = "bl";

 

var s = "string" + v;  //"stringbl"

var a = [1,v];  //[1,"bl"]

var o = {first : v};  //{first : "bl"}

 

 

但是,如果碰到了用正则字面量,貌似一切就没这么好了。

var v = "bl";

var re = /^\d+$/gim;

这时,假如你想给\d+后面加入v这个变量,你会发现,没法弄。因为无论你怎么写,都会被当作正则的一部分来处理。

 

 

二、构造函数

在JS的世界中。除了null,undefined。其余皆是对象。

不过,这里肯定有人说,string、number、boolean怎么会是对象呢。

其实虽然我上面那句话不准确,但确实是最直观的感受。因为string、number、boolean在你用的时候,会默认的被相应的基本包装类型给转换成对象。

然后我们又知道,在JS中,所有的对象都是通过构造函数来生成的。

那么,我们就可以用构造函数来代替字面量定义法,例如:

var s = new String("string"); //String对象,toString()后为"string"

var a = new Array(1,2); //[1,2]

var o = new Object();  //{}

 

 

相应的,我们也可以用构造函数来生成正则表达式

var re = new RegExp("^\\d+$","gim"); //注意,反斜杠需要转义

那么,给它加变量,就和我们前面写的给字符串加变量一样了。

var v = "bl";

var re =new RegExp("^\\d+" + v + "$","gim"); // re为/^\d+bl$/gim

至此,最初的问题问题也完全解决了。

 

 

另外,还有一种方法是用过eval动态执行一段字符串的方法,不过我觉得从各方面来说,都属下策。

var re = eval("/^\\d+" + v + "$/gim")


  • 2021-02-03 16:52:27

    ios静态库和动态库区别

    Framework 是 Cocoa/Cocoa Touch 程序中使用的一种资源打包方式,可以将代码文件、头文件、资源文件(nib/xib、图片、国际化文本)、说明文档等集中在一起,方便开发者使用。Framework 其实是资源打包的方式,和静态库动态库的本质是没有什么关系。

  • 2021-02-03 16:57:34

    iOS中的动态库和静态库分析

    由于最近研究组件化后调试时二进制映射源码的功能,发现需要对开发中的动态库和静态库需要有一些了解。所以就有了这篇文章,由于只是了解,并没有深入到编译层面,所以本篇文章只是简单了解一些库的知识,并不深入。

  • 2021-02-03 16:58:39

    iOS静态库与动态库的区别与打包

    这篇主要是记录一下 iOS 下静态库与动态库的打包流程,以便以后用到时快速查阅,供自己也供大家学习记录。同时也简述了一下 动态库 与 静态库 的区别。

  • 2021-02-03 16:59:59

    iOS 静态库和动态库全分析

    库就是程序代码的集合,将 N 个文件组织起来,是共享程序代码的一种方式。从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行。

  • 2021-02-03 17:01:30

    iOS库 .a与.framework区别

    静态库:连接时完整地拷贝至可执行文件中,被屡次使用就有多份冗余拷贝。 动态库:连接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。

  • 2021-02-03 17:13:58

    iOS - 封装静态库

    静态库:链接时完整的拷贝至可执行文件中,被多次使用就有多份冗余拷贝,.a的静态库 .framework的静态库

  • 2021-02-03 17:16:07

    iOS 中的动态库、静态库和 framework

    首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别人使用。 什么时候我们会用到库呢?一种情况是某些代码需要给别人使用,但是我们不希望别人看到源码,就需要以库的形式进行封装,只暴露出头文件。另外一种情况是,对于某些不会进行大的改动的代码,我们想减少编译的时间,就可以把它打包成库,因为库是已经编译好的二进制了,编译的时候只需要 Link 一下,不会浪费编译时间。

  • 2021-02-03 17:17:53

    iOS 同一个工程下打包不同的app

    应用图标,启动画面,应用启动后的首页都不一样。 有些课程(例如公务员考试和高考)是有目标考试的概念,不同的目标考试大纲是不一样的。拿高考来举例,北京的高考和上海的高考,就有着完全不一样的考试大纲。高考的文科和理科,又有着完全不同的考试科目。 有些课程会有一些自定义的界面,例如高考的应用可以设置昵称,有些课程的真题练习中是有推荐真题模块的,而有些课程又没有。 有些课程有扫描答题卡功能,有些课程有考前冲刺功能,有些课程有大题专项查看功能,而有些课程又没有上述功能。另外还有一些微小细节,但是解决方法和类似,所以就不一一展开说明。