作为一名程序员,对于正则表达式,都不陌生。但是在工作中可能并不会经常性的用到,所以就造成一旦有任务下来第一时间,就是去百度上面去找,虽然大多都能找到,但是如果自己能懂,那不是更好吗?而且网上的也并不一定能让完全符合项目需求~
基础知识
用\d可以匹配一个数字,\w可以匹配一个字母或数字,所以:
- ‘00\d’可以匹配’007’,但无法匹配’00A’;
- ‘\d\d\d’可以匹配’010’;
- ‘\w\w’可以匹配’js’;
.可以匹配任意字符,所以:
- 'js.‘可以匹配’jsp’、‘jss’、'js!'等等。
要匹配变长的字符,在正则表达式中,用*表示任意个字符(包括0个),用+表示至少一个字符,用?表示0个或1个字符,用{n}表示n个字符,用{n,m}表示n-m个字符:
例子:\d{3}\s+\d{3,8}。
-
\d{3}表示匹配3个数字,例如’010’;
-
List item \s可以匹配一个空格(也包括Tab等空白符),所以\s+表示至少有一个空格,例如匹配’ ‘,’\t\t’等;
-
\d{3,8}表示3-8个数字,例如’1234567’。
进阶
要做更精确地匹配,可以用[]表示范围,比如: -
[0-9a-zA-Z_]可以匹配一个数字、字母或者下划线;(意思就是:对于只有一个字符的字符串才好使)
-
[0-9a-zA-Z_]+可以匹配至少由一个数字、字母或者下划线组成的字符串,比如’a100’,‘0_Z’,'js2015’等等;
-
[a-zA-Z_$][0-9a-zA-Z_$]*可以匹配由字母或下划线、 开 头 , 后 接 任 意 个 由 一 个 数 字 、 字 母 或 者 下 划 线 、 开头,后接任意个由一个数字、字母或者下划线、 开头,后接任意个由一个数字、字母或者下划线、组成的字符串,也就是JavaScript允许的变量名;
-
[a-zA-Z_$][0-9a-zA-Z_$]{0,
19}更精确地限制了变量的长度是1-20个字符(前面1个字符+后面最多19个字符)。 -
A|B可以匹配A或B,所以(J|j)ava(S|s)cript可以匹配’JavaScript’、‘Javascript’、‘javaScript’或者’javascript’。
^表示行的开头,^\d表示必须以数字开头。
$表示行的结束,\d$表示必须以数字结束。
你可能注意到了,js也可以匹配’jsp’,但是加上^js$就变成了整行匹配,就只能匹配’js’了。
正则表达式创建的方式
首先正则表达式创有两种方式
例如,匹配一个以ABC开头,001结尾,中间用-号隔开的字符串。
可以使用一下两种方式:
// 第一种方式是直接通过/正则表达式/
var re1 = /ABC\-001/;
// 第二种方式是通过new RegExp('正则表达式')创建一个RegExp对象
var re2 = new RegExp('ABC\\-001');
// 注意,为什么第二种写法有两个\\?因为字符串的转义问题,所以字符串的两个\\实际上是一个\。
正则表达式的使用方式
var re = /^\d{3}\-\d{3,8}$/;
re.test('010-12345'); // true
re.test('010-1234x'); // false
re.test('010 12345'); // false
RegExp对象的test()方法用于测试给定的字符串是否符合条件。
这才是干货
工作中一般使用正则只会遇到这两种情景:
1、只能输入什么?
2、不能输入什么?
// 只能输入什么
// 以^开头$结尾,例如:
var re = /^[0-9a-zA-Z]+$/; // 只能输入数字,字母(不区分大小写)
// 不能输入什么
// 再加上一个^就是取反的意思
var re = /^[^#$@%^&*()¥()]+$/; // 不能输入#¥%&*等特殊字符。
注意:取反还有一种方式,主要用于在代码校验:if(!re.test()){}即可。
补充几个常用的正则表达式
var re = /^[\u4e00-\u9fa5]+$/; // 只能输入中文
var re2 = /^[0-9a-zA-Z]\u4e00-\u9fa5]+$/; // 只能输入中英文和数字
var re3 =/(http|https):\/\/([\w.]+\/?)\S*/; // 必须以http,https开头,且需符合URL规范(即,https://www格式)