我们已经会熟练使用js字符串类型了,例如你想知道一个变量是否等于一个字符串,可能可能这样判断
if(a=='hello,world'){ ...}复制代码
但是往往我们有时候对一些字符串判断显得力不从心,例如判断一个文件的类型是否为js类型,可能有下面几种文件名格式
1, hello.js2, js.hello3, hellojs4, helljso复制代码
以我们人脑的认知来看,我们一眼能够看出只有第一个符合我们的要求,但是我们怎么写这个判断程序呢?例如我们可以这样判断,例如js字符串方法,从右边往左边取三位,如果为‘.js’则匹配成功。 但是我问一下如果文件名描述为hello..js呢?显然,这种方法不太适合,所以需要正则表达式来进行精确匹配了。 正则表达式用于描述一种特征,就例如你描述某某女生长得怎么样一样。例如瓜子脸,一米六到一米七,长头发... 同理我们可以使用正则表达式来描述我们需要的字符,例如邮箱格式:
一串数字或者字母+@+字符串或者数字+'.'+'数字或者字符串'复制代码
我们怎么用代码来描述我们的这个对象呢,我们可以使用例如下面的写法
var a=/hello/i或者var a = new RegExp('hello',i);复制代码
/ / 之间写入你的匹配规则 后面加一个修饰符i 或者g或者m
i表示忽略大小写,即人为HELLO和hello是一样的g表示全局,多用在匹配和搜索中,我们先暂且不管。m表示多行匹配复制代码
我们首先学会怎么描述规则,即怎么写/ /之间的规则 对于某种特征一般有一下几种关系。
- 精确的。例如字符为'hello'的,只需/hello/即可,如果你接收HELLO,即/hello/i即可
- 含有,例如0-9之间
- 范围加限定长度,例如我需要匹配长度为4的0-9之间数字
- 边界的,例如 结尾为.js 或者开头为020-的电话格式
对于我们是否写对了规则,我们可以用test()方法试一试 test()好比一面照妖镜
var a=/hello/iconsole.log(a.test('heelo') //false复制代码
说明heelo和a不匹配,是个假的。 下面分别说明上述几种
- 包含[],这种关系类似于数学之中排列组合,例如[abc],代表a,b,c所能组成的各种组合
let a=/[0-9]/;console.log(a.test(9)) //trueconsole.log(a.test(90)) //trueconsole.log(a.test('90')) //trueconsole.log(a.test('90SS')) //trueconsole.log(a.test('ABCD')) //falselet b=/[0]/;console.log(b.test(9)) //fasleconsole.log(b.test(90)) //true复制代码
let a=/[abc]/;console.log(a.test('a')) //trueconsole.log(a.test('ac')) //trueconsole.log(a.test('abc')) //trueconsole.log(a.test('ABCD')) //false复制代码
let a=/[*&$]/;console.log(a.test('*')) //trueconsole.log(a.test('*$')) //true复制代码
下面有几个常用的[]写法
1.[a-z] 包含字母 let a=/[a-z]/; console.log(a.test('a')) //true console.log(a.test('Z')) //false 因为区分大小写 console.log(a.test('abc')) //true console.log(a.test('aS')) //true2.[A-Za-z0-9]包含大写或小写字母或数字复制代码
单单使用[]是有局限的,因为它能匹配的实在是太宽泛了,只要包含即可。例如[a-z],对于字符'a2'也是符合的。要使得我们匹配更加精确,正则表达式还有许多武器,例如元字符。 元字符个人理解是一种限制规则来缩小匹配范围 一般来说有
限定属性以及长度。
\d 表示匹配一位整数 相反\D匹配一个非数字; \w 表示匹配一位英文单词 相反\W匹配一个非英文单词; \s 表示匹配一位空格 相反\S匹配一个非空格; ... 更多可以参考 http://www.runoob.com/jsref/jsref-obj-regexp.html复制代码
使用这个有什么用呢?你已经知道了属性和长度,你可以去检测某些连在一起的特征,例如你现在有一篇英文的文章,我需要找到特征: 3位数字+3位字母的部分标红:
let txt='s23df12S456abx'; ==> /\d\d\d\w\w\w/let a=/\d\d/;console.log(a.test('1')) //false console.log(a.test('12')) //trueconsole.log(a.test('1ac2')) //false 必须两个相连let b=/\s/;console.log(b.test('my file.js')) //true 检测是否含有空格复制代码
限定位置
我们已经会使用属性加长度了,但是有时候往往我们也需要位置的限定 。下面列举几个常用的元字符
$ 表示结尾 例如/js$/表示js不能再有任何字符串了,空格也不行let a=/hello$/;console.log(a.test('hello')) //true console.log(a.test('hello world')) //falseconsole.log(a.test('hello ')) //false^ 表示开头 意思和 $ 相反 即使空格也不行,一般^和$成对使用,可以构造出一些常用的正则表达式。例如由字母和数字组成,长度不限的话可以表示为/^[A-Za-z0-9]$/let a=/^[A-Za-z0-9]$/;console.log(a.test('我a')) //falseconsole.log(a.test('$123a')) //falseconsole.log(a.test('hello 23')) //fasleconsole.log(a.test('hello23 ')) //false复制代码
如果想要使得空格也可以匹配 可以使用\b \b表示边界,可以为开头或者结尾 例如 ' hello,world '
let a=/\bhi\b/; console.log(a.test('hi')) //true console.log(a.test('him')) //false 后面有m console.log(a.test('hi m')) //true hi是单独的 console.log(a.test('shi')) //false 前面有s复制代码
量词使用
例如我们想匹配连续三个数字,我们可以:
/\d\d\d/复制代码
假如要匹配100个呢 写100个吗?我们不可能手动写100个吧 我们有下面几个常用的表述:
- +表示重复 n+匹配任何包含至少一个 n 的字符串。 /abc+/ 可以匹配 abc abcc abccccc abccccd
- *表示匹配任何包含至少0个或者一个 n 的字符串
/abc*/ 可以匹配 ab abc abccc abccd 可以不包括c复制代码
- {}使用 上述+和*号范围都可以多到无限多。但是要表示具体多少个呢 我们可以使用{},这类似于数学里的表示范围[a,b]
let a=/^c{1,3}$/;console.log(a.test('c')) //trueconsole.log(a.test('cc')) //trueconsole.log(a.test('ccc')) //trueconsole.log(a.test('cccc')) //false其中{1,3}表示出现1-3个 {1,}表示匹配一个或者一个以上{1}表示只匹配一个。复制代码
当然还有许多正则表达式规则了,实在写不完了,读者可以自行百度。(完)