本文实例讲述了JavaScript 正则应用。分享给大家供大家参考,具体如下:

正则应用

正则表达式在web开发中的常用

邮箱验证

用户名验证

替换字符串某一部分

信息采集,用来分析有效代码段

...

有规律的字符串描述

正则表达式是一门独立的知识,同样的一段描述,比如,对于email的匹配表达式,在不同的语言是一样的,但是调用的函数不同。

正则表达式--规则表达式

正则表达式:正则表达式

正则表达式语法:正则表达式语法

正则表达式语言:正则表达式语言

准备性的工作

在js中,如何写正则表达式。 /RegExp/

在js里,用正则表达式来验证字符串是否满足, 使用 reg.test(str);

用正则表达式的exec函数,用来查找匹配的选项,并把查找的值取出。

reg.test(str); 返回true 或者false 。 常在表单验证中使用。

请输入姓名:

请输入年龄:

var oBD = document.getElementById('biaodan');

var oName = document.getElementById('name');

var oAge = document.getElementById('age');

//表单试图提交的时候,触发onsubmit事件

//这个函数返回了false,表单不会被提交

oBD.onclick = function(){

//验证name

if( !/^[\u4e00-\u9fa5]{2,4}$/.test(oName.value) ) return false;

//验证年龄

if( !/^\d{2,3}$/.test(oAge.value) ) return false;

if( parseInt( oAge.value )<10 || parseInt( oAge.value )>104 ) alert('您输入的年龄不在范围') return

false;

return true;

}

exec(); 返回 数组 或 null。

exec是英语execute的意思,CEO首席执行官,E就是executive执行的

“执行” 把正则式放到字符串上执行

每次执行结果按序输出,不管结果有几个,一次只输出一个 ,如果多次输出,会保持前面的引用。当匹配超过原字符串的时候,会返回null。然后遇到null,指针返回到匹配的字符的第一位。 具有迭代器的感觉。

var str = 'ABCDEFG1234567abcdefg';

var reg = /[a-z]/g;

console.log( a=/[a-z]/g.exec(str) );

var a;

while( a=reg.exec(str) ){ //这边 null 为 fasle。 exec() 会保持对前面一次的引用。 需要使用 值来赋值。

console.log( a );

}

使用exec() 找最大子串

var str = 'AAABBBCCCCCCC';

var reg = /(\w)\1+/g;

var maxLength = 0;

var maxLetter = '';

var a;

while( a=reg.exec(str) ){

if( a[0].length>maxLength ){

maxLength = a[0].length;

maxLetter = a[0];

}

}

console.log( maxLetter );

var str='BCDEFG1234567abcdefg';

var reg = /[a-z]/g;

var a;

while( (a=reg.exec(str)) != null ){ //先赋值给a,然后再与后边判断。

console.log( a );

}

str.match( reg ); //查找,匹配到,返回数组

str.split( reg ); //拆分,返回数组

str.serch( reg ); //查找位置

str.replace( reg,'new str'); //正则替换,返回string

//测试是否含有hi

var reg = /hi/; //仅看字符串是否有 hi

console.log( reg.test('hello') ); //fasle

console.log( reg.test('this is iqianduan') ); //true

//测试单词 hi

var reg01 = /\bhi\b/;

console.log( reg01.test('this is') ); //false

console.log( reg01.test('this is, hi,his') );//true

正则表达式 3 句话

要找什么字符?

从哪儿找?

找几个?

要找什么字符

字面值, ‘hi' ,就是找‘hi'。

用字符的集合来表示 , [abcd], 指匹配abcd中任意一个

//找不吉利的数字

//3,4,7

var reg = /[3,4,7]/; //字符集合, 不能使用 /347/ 字面值表示,是表示整体。

console.log( reg.test('12121212') );//false

console.log( reg.test('12341234') ); //true

用范围表示字符 , [0-9] [0123456789] [a-z] [A-Z]

// var reg = /[0123456789]/;

var reg = /[0-9]/;

console.log( reg.test('123afsdf') ); //true

console.log( reg.test('asdf') ); //false

//是否有大写字母

var reg = /[A-Z]/;

console.log( reg.test('asdf') );//false

console.log( reg.test('Tomorrow is another day') ); //true

字符簇, 花团锦簇-> 一坨字符。

系统为常用的字符集合,创建的简写.

例如:

[0-9] --> \d

[0-9a-zA-Z_] --> \w .. 域名,注册用户名常用的模式.

[\t\v\f\r\n] --> \s 空白符.

//是否含有数字

var reg = /\d/;

console.log( reg.test('123afsdf') ); //true

console.log( reg.test('asdf') ); //false

补集的形式来表示字符集合 在集合前面使用表示补集。

[0-9]---> [^0-9] ^ 脱字符号: 念法: caret。['kærət] 。

[abcdef]-->[^abcdef]

//验证全为数字

var reg = /^[0-9]/; //匹配非数字

// var reg = /^d/ //字符簇补集

console.log( reg.test('aaaaa') );//非数字存在 false

console.log( reg.test('123aaa') ); //有数字存在 true

字符簇的补集:

d -- > D(非数字)

s --> S(非空白字符)

w --> W

任意字符 : . 唯独不包括换行符

从哪儿找,找到哪儿

b 单词边界

/bhi/ --> 从单词的边界开始匹配hi。

// 匹配单词hi,包括hi本身

// var reg = /\bhi.+/;//错误

// var reg = /\bhi\w+/; //错误。 + --> 至少有 一个

var reg = /\bhi\w*/;

console.log( reg.exec('this is') ); //null

console.log( reg.exec('his') ); //["his", index: 0, input: "his"]

console.log( reg.exec('history') ); //["history", index: 0, input: "history,hi"]

//匹配进行时的结尾

var reg = /\b[a-zA-Z]+ing\b/;

console.log( reg.exec('going') );//["going", index: 0, input: "going"]

console.log( reg.exec('1ting.com') );//null

console.log( reg.exec('ing') );//null //2 -> to 4->for 0->zero

//匹配un前缀的反义词

//unhappy happy,hungry,sun,unhappy

var reg = /\bun[\w]+\b/;

console.log( reg.exec('happy,hungry,sun,unhappy') ); //["unhappy", index: 17, input: "happy,hungry,sun

,unhappy"]

B 单词的非边界

// 把单词中间的某一个部分取出来。

// 把中间含有hi的单词取出,即hi不能在两端。

var reg = /\Bhi\B/;

console.log( reg.exec('this') ); //["hi", index: 1, input: "this"]

console.log( reg.exec('hi') ); //null

^ creat , 从字符串的起始位置开始匹配

$ 匹配到字符串的结束位置从字符串的开头到结尾开始匹配,模拟运行顺序.

var reg = /^lishi$/;

console.log( reg.exec('lishinihao') ); null

console.log( reg.exec('lishi') ); //["lisi", index: 0, input: "lisi"]

找多少

*, [0,n] --> {0, }

+ , [1,n] -->{1, }

? , [0,1] -->{0,1}

n {n} {3} a{n} , 字符a准确的出现n次

a{n,} 字符a,至少出现n次。

a{n,m} 字符串a,出现n到m次。

模式

以匹配为例,默认情况下,找到一次结果符合就结束。

告知匹配过程,一直找,在全文范围内一直找。

g -> 全局模式, global 找所有的,而不是找一次就结束

i -> 忽略大小写,ignore

//查找所有中间含有hi的单词

var reg = /\Bhi\B/gi;

var str = 'shit,hi,this,thit,THIS';

console.log( str.match(reg) ); //["hi", "hi", "hi", "HI"]

确定边界是什么,那些东西必须有,那些东西可能有可能没有。配合+,*

//把链接换成 #

// -->

//1,不能保留链接的文字(反向引用)

//2,不能跨行(贪婪模式)

var reg = //g;

var str = '';

console.log( str.replace(reg,'文字') );

js不支持单行模式。

//s 单行模式:把整个字符串看成一行

. 代表任意,但不包括换行。

在js里,不支持当行模式的情况下,如何换行?

什么样的模式能代表“所有” 字符串

sS 全部字符 使用一个技巧, 一个集合加补集,就是全集

[dD] [sS] [wW]

var reg = /\/g;

var str = ''+

'';

console.log( str.replace(reg,'文字') );

//s 多行模式:碰到一行就把当前的当成一个字符串来解析

//把每一行的结尾的数字换成 #

//车牌号

//Cx003

//A0008

//B3456

var str = 'Cx003'+

'A0008'+

'B3456';

var reg = /\d+$/gm;

console.log( str.replace(reg,'#') );

贪婪模式

如果'?'紧跟在在任何量词*, + , ?,或者是{}的后面,将会使量词变成非贪婪模式(匹配最少的次数),和默认的贪婪模式(匹配最多的次数)正好相反。

比如,使用/d+/非全局的匹配“123abc”将会返回“123”,如果使用/d+?/,那么就只会匹配到“1”。

当正则表达式中包含能接受重复的限定符时,通常的行为是(在使整个表达式能得到匹配的前提下)匹配尽可能多的字符。以这个表达式为例:a.b,它将会匹配最长的以a开始,以b结束的字符串。如果用它来搜索aabab的话,它会匹配整个字符串aabab。这被称为贪婪匹配。

任何量词后面 跟 ? 代表非贪婪模式 , 满足条件就不找了,小富即安,打完收工。 修饰个数,尽量少找和多找的。

//goooooooooods --> goods

var str = 'goooooooooods,goooods,goooood,gooooo,gooooods';

var reg = /g[o]{3,}?ds/g;

console.log( str.replace(reg,'goods') ); //goods,goods,goooood,gooooo,goods

欲查

正向欲查

欲查不消耗字符。

//查找进行时的单词的词根, 即 不要ing 。 going -> go

var str = 'going,comming,fly';

// var reg = /\b[a-zA-Z]+ing\b/g;

var reg = /\b[\w]+(?=ing)\b/g; // 类似探照灯,先去判断几位是否满足,满足返回,不满足继续下一位.

console.log( str.match(reg) );

满足 ing ,找到com。

不满足接着走。 看见不满足条件,并不会一次性调到ing后面接下去寻找,而是从该处光标继续寻找。

已经查找的词是消耗了,下次从该处光标开始寻找。

//查找进行时的单词的词根, 即 不要ing 。 going -> go

var str = 'going,comming,fly';

// var reg = /\b[a-zA-Z]+ing\b/g;

// var reg = /\b[a-zA-Z]+(?=ing)\b/g; //结尾\b 是错误的, 欲查不消耗字符, 相当于/\b[a-zA-Z]+\b/ 这种形式

var reg = /\b[a-zA-Z]+(?=ing)/g; // 类似探照灯,先去判断几位是否满足,满足返回,不满足继续下一位.

console.log( str.match(reg) ); // ["go", "comm"]

负向欲查

不是谁才行。 往后看一定位数,不是谁才可以。 不要后面是某某某的东西。

//查找win98,win95,win32,win2003,winxp -->win98,win32,win2003,winxp

var str = 'win98,win95,win32,win2003,winxp';

var reg = /\bwin(?!95)/g;

console.log( str.match(reg) ); // ["win", "win", "win", "win"]

js不支持,向前正向欲查,向前负向欲查:

//找出 un系列单词的词根

var reg = /[\w]+(?<=un)/g;

var str = 'unhappy';

console.log(str.match(reg)); //报错

var reg = /[\w]+(?

反向引用

反向引用,也叫后向引用。或者分组或子表达式

一般是整个表达式, 但是中间的部分 有特殊做了描述。 需要的部分特殊处理。使用分组,叫做子表达式。

//把链接换成空连接,保持文字信息。

var str = '阴天快乐';

var reg = /]+>([^<>]+)/; //超链接的表达式

console.log( reg.exec(str) ); //["阴天快乐", "阴天快乐", index: 0

, input: "阴天快乐"] //能够把子表达式的东西匹配出来。

// console.log( str.replacte(reg,'#') );

/**

]>([^<>]+) 主要目的是想要中间那一块

除了>之外的都可行 , 取> 的补集 [^>]

中间部分纯文字,不含大于号,和小于号。 取小于号和大于号的补集 [^<>]+ / [\s\S]+

*/

//一般是整个表达式, 但是中间的部分 有特殊做了描述。 需要的部分特殊处理。使用分组,叫做子表达式。

//匹配html

// /]*)?>[\s\S]*/

/*exec为例:

匹配到的数组,第0个单元,代表"整个正则表达式的匹配结果"

1,2,3,4....N,则代表第N个子表达式匹配的结果。 //js顶多有9个子表达式。 // ["阴天快乐", "阴天快乐", index: 0, input: "阴天快乐"]

*/

console.log( str.replace(reg,'$1') ); //阴天快乐

var str = '';

var reg = /]*)?>[\s\S]*/;

console.log( reg.exec(str) );

str.replace(reg,function( $1,$2 ){

console.dirxml($2); //html

});

如何引用子表达式所匹配的结果?

在正则外边使用:$N 来匹配 第N个子表达式的匹配结果。

在正则里边使用N来 使用第N个子表达式。

希望本文所述对大家JavaScript程序设计有所帮助。

php反向引用,JavaScript 正则应用详解【模式、欲查、反向引用等】相关推荐

  1. Nginx(二):反向代理原理 与 配置文件详解

    相关阅读: Nginx(一):Nginx原理概述 与 安装步骤详解 Nginx(二):反向代理原理 与 配置文件详解 Nginx(三):负载均衡策略 与 Nginx静态服务器 Nginx(四):Ngi ...

  2. 好程序员技术分析JavaScript闭包特性详解

    为什么80%的码农都做不了架构师?>>>    好程序员技术分析JavaScript闭包特性详解,今天来总结一下js闭包的那些事,以及遇到的坑和解决方法,希望对你有所帮助. 是的,没 ...

  3. python 正则使用详解

    python 正则使用详解 什么是正则 在 python 中使用正则 一些正则的定义 python 正则的方法 match 从字符串开头匹配 正则返回的结果分析(重要) fullmatch 严格匹配整 ...

  4. javaScript函数模块详解

    javaScript函数模块详解 ​ 函数实际上是对象,每个函数都是Function类型的实例,而Function也有属性和方法,和其他引用类型一样 可以将函数名想象成指针,函数想象成对象 ​ 注意, ...

  5. 史上最全JavaScript数组对象详解(二)

    JavaScript数组对象详解(二) 上一篇博客我们讲到了JavaScript数组对象的创建,访问和属性,接下来一篇博客主要讲一下JavaScript数组对象的方法及使用.说到数组的方法,主要分为两 ...

  6. JavaScript Class类详解

    ECMAScript 6 提供了更接近传统语言的写法,新引入的class关键字具有正式定义类的能力.类(class)是ECMAScript中新的基础性语法糖结构,虽然ECMAScript 6类表面上看 ...

  7. python脚本例子_python dict 字典 以及 赋值 引用的一些实例(详解)

    最近在做一个很大的数据库方面的东东,要用到根据数值来查找,于是想到了python中的字典,平时没用过dict这个东东 用的最多的还是 list 和 tuple (网上查 用法一大堆) 看了一下创建字典 ...

  8. javascript BOM对象详解

    javascript BOM对象详解 目标:本章节将分为9点详细介绍有关BOM对象的知识点 1.什么是BOM 2.BOM的构成 3.顶级对象window 4.window对象常见事件(页面加载事件和体 ...

  9. JavaScript 运行机制详解(理解同步、异步和事件循环)

    1.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. Java ...

最新文章

  1. mysql连接池为何不用nio_为什么要用数据库连接池?
  2. 【Python3_进阶系列_006】Python3-单例模式
  3. Qt5 和 Qt4 的一些改动和不同
  4. iphone导出照片到电脑_如何把 iPhone 中的照片快速传到电脑上?
  5. C语言 | 基于51单片机实现MPU6050的卡尔曼滤波算法(代码类2)
  6. linux sed 测试文件夹,测试开发笔记二(Linux与Shell脚本)
  7. 2021年高考成绩查询陕西文科,2021年陕西高考文科二本分数线预测
  8. python使用欧氏距离knn_python运用sklearn实现KNN分类算法
  9. maven打包忽略注解_maven打包后pom.properties中的注释问题-阿里云开发者社区
  10. Calibre修改保存电子书为中文
  11. 3dmax详细讲解全套攻略在线视频教程
  12. Spring MVC使用@RestController生成JSON示例
  13. IDL处理葵花8Himawari-8标准HSD数据——制作大气校正数据集(卫星角度数据)
  14. JavaScript 打开新页面
  15. PLSQL的下载、安装、配置远程连接Oracle 详解
  16. 物联网安全 - 对称加密算法
  17. 描述内存分配方式以及它们的区别?
  18. bleeding edge是什么意思
  19. 图片隐写,盲水印,加密logo
  20. F1DC2706蓝牙模块的射频特性及功耗测试

热门文章

  1. 干货 | 使用京东云搭建视频直播网站
  2. 3.1.1 docker入门
  3. 2022年末最新最全Java学习路线,结合工作经验和培训机构整理
  4. node.js读取文件中文乱码问题
  5. MySQL面试问题包含答案仅参考
  6. 学习笔记-Depth Map Prediction from a Single Image using a Multi-Scale Deep Network
  7. codeforces 821 B Okabe and Banana Trees
  8. 前端工程化实战 - 开发脚手架
  9. Excel中的数字格式与文本格式进行转换
  10. oracle 渗透,ODAT:一款专门用于Oracle渗透的工具