正则表达式

正则表达式

regular expression:RegExp

用来处理字符串的规则

  • 只能处理字符串
  • 它是一个规则:可以验证字符串是否符合某个规则(test),也可以把字符串中符合规则的内容捕获到(exec / match...)
  • 学习正则就是用来制定某种规则

正则的作用

  • 正则定义了一个字符串的模型。
  • 正则的第一个作用是“验证某字符串是否和这个模型相匹配”
  • 正则的第二个作用是“把匹配到的内容找出来”。

编写正则表达式

创建方式有两种:

  • 字面量创建方式(两个斜杠之间包起来的,都是用来描述规则的元字符;以及模式修正符)
var reg1 = /\d+/;
  • 构造函数模式创建 (两个参数:元字符字符串,修饰符字符串)
var reg2 = new RegExp("\\d+");

正则表达式由两部分组成:

  • 元字符
  • 修饰符

元字符

/*常用的元字符*/
//1.量词元字符:设置出现的次数
* 零到多次  
+ 一到多次
? 零次或者一次
{n} 出现n次
{n,} 出现n到多次
{n,m} 出现n到m次

//2.特殊元字符:单个或者组合在一起代表特殊的含义
\    转义字符(普通->特殊->普通)
.    除\n(换行符)以外的任意字符
^    以哪一个元字符作为开始
$    以哪一个元字符作为结束
\n   换行符
\d   0~9之间的一个数字
\D   非0~9之间的一个数字 (大写和小写的意思是相反的)
\w   数字、字母、下划线中的任意一个字符
\s   一个空白字符(包含空格、制表符、换页符等)
\t   一个制表符(一个TAB键:四个空格)
\b   匹配一个单词的边界
x|y  x或者y中的一个字符
[xyz] x或者y或者z中的一个字符
[^xy] 除了x/y以外的任意字符
[a-z] 指定a-z这个范围中的任意字符  [0-9a-zA-Z_]===\w
[^a-z] 上一个的取反“非”
()   正则中的分组符号
(?:) 只匹配不捕获
(?=) 正向预查
(?!) 负向预查 

//3.普通元字符:代表本身含义的
/bingdu/ 此正则匹配的就是 "bingdu"

修饰符

/*正则表达式常用的修饰符:*/
i  ignoreCase  忽略单词大小写匹配
m  multiline   可以进行多行匹配
g  global      全局匹配

/A/.test('abc')  false
/A/i.test('abc') true

元字符详细解析

^和 $

^ 用在正则表达式开始/之后,表示以...开始

var reg = /^\d/;   // 表示以\d开始  (以数字开始)
console.log(reg.test("abc"));   false
console.log(reg.test("123abc"));  true
console.log(reg.test("abc123")); false
var reg = /\d$/;
console.log(reg.test("abc"));  false
console.log(reg.test("123abc")); false
console.log(reg.test("abc123")); true
// ^/$两个都不加表示字符串中包含符合规则的内容即可
var reg1 = /\d+/;
// ^/$两个都加表示字符串只能是和规则一致的内容
var reg2 = /^\d+$/;

\转义符

//.不是小数点,是除\n外的任意字符
var reg = /^2.3$/;  // 以2开始, 以3结束,中间有一位字符(除\n都可以)
console.log(reg.test("2.3"));   // true
console.log(reg.test("2#3"));   // true
console.log(reg.test("23")); // false    中间没有任意字符
console.log(reg.test("2tt3")); // false   中间有两个(只能有一个)
//基于转义字符,让其只能代表小数点
var reg = /^2\.3$/;
console.log(reg.test("2.3"));  // true
console.log(reg.test("2#3"));  // false

// var reg = /^[0-9]\.[0-9]$/;
    // console.log(reg.test("2.3")); // true
    // console.log(reg.test("9.7")); // true
    // console.log(reg.test("2#3")); // false
    // console.log(reg.test("23")); // false
    // console.log(reg.test("2tfdfdt3")); // false
    // console.log(reg.test("94.76")); // false

    // var reg = /^[0-9]+\.[0-9]$/;
    // console.log(reg.test("2.3")); // true
    // console.log(reg.test("9.7")); // true
    // console.log(reg.test("2#3")); // false
    // console.log(reg.test("23")); // false
    // console.log(reg.test("2tfdfdt3")); // false
    // console.log(reg.test("9444.7")); // true

    var reg = /^[0-9]+\.[0-9]{2}$/;
    console.log(reg.test("2.3")); // true
    console.log(reg.test("9.7")); // true
    console.log(reg.test("2#3")); // false
    console.log(reg.test("23")); // false
    console.log(reg.test("2tfdfdt3")); // false
    console.log(reg.test("9444.74")); // true

x|y

//直接x|y会存在很乱的优先级问题,一般我们写的时候都伴随着小括号进行分组,因为小括号改变处理的优先级 小括号:分组
var reg = /^(13|15)$/;
console.log(reg.test("13")); true
console.log(reg.test("15")); true
console.log(reg.test("135"));  false
console.log(reg.test("153"));  false

[]

//1.中括号中出现的字符一般都代表本身的含义
var reg = /^[@+]$/;
console.log(reg.test("@")); true
console.log(reg.test("+")); true

console.log(reg.test("@+"));  false
var reg = /^[\d]$/; //\d在中括号中还是0-9

console.log(reg.test("d"));  // false
console.log(reg.test("9"));   // true

//2.中括号中不存在多位数
reg = /^[18]$/;
console.log(reg.test("1")); true
console.log(reg.test("8")); true
console.log(reg.test("18")); false

reg = /^[10-29]$/; //1或者0-2或者9
console.log(reg.test("1"));  true
console.log(reg.test("9"));  true
console.log(reg.test("0"));  true
console.log(reg.test("2"));  true
console.log(reg.test("10"));  false

{n}, {n,}, {m,n} 注意 m和n之间不能有空格

// {n}表示出现过n次
var reg = /c{1}/;   
console.log(res.test('china')); 
console.log(res.test('chinac')); 
// {m,n}匹配最少m个,最多n个  c{3,4}的意思是,连续的3个c或者4个c

// c{1,}表示1个以上的c,相当于元字符+

// *表示0次或者多次,等同于{0,},即c* 和c{0,} 是一个意思。
// +表示一次或者多次,等同于{1,},即c+ 和c{1,} 是一个意思。
// ?表示0次或者1次,等同于{0,1},即c? 和c{0,1} 是一个意思。

正则表达式的方法:

  • test() // test() 方法检索字符串中的指定值。返回值是 true 或 false。
  • exec() // exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。

常用的正则表达式

  1. 验证是否为有效数字

    /*
     规则分析:
         1. 可能出现+-(正负)  [+-]?
         2. 一位0-9可以的,或者多位,但多位的情况下,首位不能是0   \d|[1-9]\d+
         3. 可能会小数点      (\.\d+)?
    */
    var reg = /^[+-]?(\d|[1-9]\d+)(\.\d+)?$/;
    
  1. 验证密码

    //数字、字母、下划线    \w
    //6~16位   {6,16}
    var reg = /^\w{6,16}$/
    
  2. 验证真实中文姓名

    1. 中文的unicode编码区间:  \u4e00 - \u9fa5
    2. 长度  至少两个, 至多30个  {2,10}
    3. 可能译名 · 
    var reg = /^[\u4e00-\u9fa5]{2,10}(·[\u4e00-\u9fa5]{2,10}){0,2}$/;
    
  1. 验证邮箱

    //1.开头是数字字母下划线(1到多位)
     \w+
    //2.可以是 -数字字母下划线  (零到多次)
        [\w-]*
    //3. @后面紧跟着:数字、字母 (1-多位)   @后不能直接跟下划线和中划线
          @[a-zA-Z0-9]+
    //4. 再后面跟字母、数字、下划线、中划线
         [\w-]*
    //5. 域名     .com也可以多域名.com.cn
           (\.[a-zA-Z0-9]+)+
     var reg = /^\w+[\w-]*@[a-zA-Z0-9]+[\w-]*(\.[a-zA-Z0-9]+)+$/;
    
  1. 验证身份证号码

    // 1.基本上是数字 一共18位
    // 2. 最后一位可能是X
    var reg = /^\d{17}(\d|X)$/;
    
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容