详细js 正则的解释

简介:

g 代表全局匹配
m 代表可以进行多行匹配
i 代表不区分大小写匹配
^ 匹配输入字符串的开始位置
匹配输入字符串的结束位置 * 匹配前面的子表达式零次或多次. 等价于{0,} + 匹配前面的子表达式一次或多次. 等价于{1,} ? 匹配前面的子表达式零次或一次. 等价于[0,1} , 当该字符跟在任何一个其他限制符(*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。  \d 匹配一个数字字符. 等价于 [0-9] \D 匹配一个非数字符. 等价于 [^0-9] \w  ,等价于 "[A-Za-z0-9_]" \W 匹配任何非单词字符,等价于 "[^A-Za-z0-9]" \s 匹配任何空白字符, 包括空格 制表符 换页符 等等. 等价于[\f\n\r\t\v] \S 匹配任何非空白字符. 等价于 [^\f\r\n\t\v] \b 匹配一个单词边界,也就是指单词和空格间的位置。 \B 匹配非单词边界。  (pattern)匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用匹配输入字符串的结束位置 * 匹配前面的子表达式零次或多次. 等价于{0,} + 匹配前面的子表达式一次或多次. 等价于{1,} ? 匹配前面的子表达式零次或一次. 等价于[0,1} , 当该字符跟在任何一个其他限制符(*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。  \d 匹配一个数字字符. 等价于 [0-9] \D 匹配一个非数字符. 等价于 [^0-9] \w  ,等价于 "[A-Za-z0-9_]" \W 匹配任何非单词字符,等价于 "[^A-Za-z0-9]" \s 匹配任何空白字符, 包括空格 制表符 换页符 等等. 等价于[\f\n\r\t\v] \S 匹配任何非空白字符. 等价于 [^\f\r\n\t\v] \b 匹配一个单词边界,也就是指单词和空格间的位置。 \B 匹配非单词边界。  (pattern)匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用0…$9 属性。

(?:pattern)匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

(?=pattern)正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern)负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 

匹配2-4个汉字

 程序代码
/^[\u4e00-\u9fa5]{2,4}$/g;



匹配6到18个(字母,数字,下划线)字符

 程序代码
/^\w{6,18}$/;

 

 程序代码
/^[A-Za-z0-9_]$/;



匹配HTML标签

 程序代码
/<[^>]*>|<\/[^>]*>/gm;

 

 程序代码
/<\/?[^>]+>/gm;



匹配左右两端的空格

 程序代码
/(^\s*)|(\s*$)/g;



优先级顺序(从高到低)
\ 转义符
(),(?:),(?=),[] 圆括号和方括号
* , + , ? , {n} , {n,} , {n,m} 限定符
^ , [vapour:content]nbsp; 位置和顺序
| "或"操作

匹配两个连续的以空格分开的相同单词

 程序代码
/\b([a-z]+) \1\b/gim ;


在这个示例中,子表达式就是圆括号之间的每一项。
所捕获的表达式包括一个或多个字母字符,即由'[a-z]+' 所指定的。
该正则表达式的第二部分是对前面所捕获的子匹配的引用,也就是由附加表达式所匹配的第二次出现的单词。
'\1'用来指定第一个子匹配。单词边界元字符确保只检测单独的单词。
如果不这样,则诸如 "is issued" 或 "this is" 这样的短语都会被该表达式不正确地识别。

 程序代码
var ss = "Is is the cost of of gasoline going up up?. Is is the cost of of gasoline going up up?.";
var re = /\b([a-z]+) \1\b/gim;    
var rv = ss.replace(re,"$1"); 
document.write(rv) //输出 "Is the cost of gasoline going up?. Is the cost of gasoline going up?. "




 程序代码
/\bCha/


匹配单词 'Chapter' 的前三个字符,因为它们出现在单词边界后

 程序代码
/ter\b/


匹配单词 'Chapter' 中的 'ter',因为它出现在单词边界之前

 程序代码
/\Bapt/


匹配 'apt',因为它位于 'Chapter' 中间,但不会匹配 'aptitude' 中的'apt',因为它位于单词边界后
*/


匹配URL地址

 程序代码
/(\w+):\/\/([^\/:]+)(:\d*)?([^#]*)/


将下述的URI 分解为协议 (ftp, http, etc),域名地址以及页面/路径:
http://msdn.microsoft.com:80/scripting/default.htm

第一个附加子表达式是用来捕获该 web 地址的协议部分。该子表达式匹配位于一个冒号和两个正斜杠之前的任何单词。第二个附加子表达式捕获该地址的域名地址。该子表达式匹配不包括 '^'、 '/' 或 ':' 字符的任何字符序列。第三个附加子表达式捕获网站端口号码,如果指定了该端口号。该子表达式匹配后跟一个冒号的零或多个数字。最后,第四个附加子表达式捕获由该 web 地址指定的路径以及\或者页面信息。该子表达式匹配一个和多个除'#' 或空格之外的字符。

将该正则表达式应用于上面所示的 URI 后,子匹配包含下述内容:

RegExp.1"http"RegExp.1包含"http"RegExp.2 包含 "msdn.microsoft.com"

RegExp.3":80"RegExp.3包含":80"RegExp.4 包含 "/scripting/default.htm"

正则表达式的方法

1 test方法

返回一个Boolean值,它指出在被查找的字符串中是否存在模式

rgExp.test(str)

全局RegExp对象的属性不由test方法来修改

example1

  

 程序代码
var url=" http://msdn.microsoft.com:80/scripting/default.html";
  var reg=/(\w+):\/\/([^\/:]+)(:\d*)?([^#]*)/;
  var flag=reg.test(url);
  flag  //返回true
  RegExp. 1//"http"RegExp.1//返回"http"RegExp.2 //返回"msdn.microsoft.com"
  RegExp. 3//":80"3//返回":80"egExp.$4 //返回"/scripting/default.html"


  
  search和test方法都不能更新全局RegExp对象,所以RegExp.input,RegExp.index,RegExp.lastIndex返回undefined

2 match 方法

使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回

 程序代码
stringObj.match(rgExp)



如果match方法没有找到匹配,返回null。如果找到匹配返回一个数组并且更新全局RegExp对象的属性以反映匹配结果。

match方法返回的数组有三个属性:input、index和lastIndex。
Input属性包含整个的被查找的字符串。
Index属性包含了在整个被查找字符串中匹配的子字符串的位置。
LastIndex属性包含了最后一次匹配中最后一个字符的下一个位置。

如果没有设置全局标志(g),数组的0元素包含整个匹配,而第1到n元素包含了匹配中曾出现过的任一个子匹配。
这相当于没有设置全局标志的exec方法。如果设置了全局标志,元素0到n中包含所有匹配

example1(没有设置全局标志)

  

 程序代码
var url=" http://msdn.microsoft.com:80/scripting/default.html";
  var reg=/(\w+):\/\/([^\/:]+)(:\d*)?([^#]*)/;
  var myArray=url.match(reg);
  RegExp. 1//"http"RegExp.1//返回"http"RegExp.2 //返回"msdn.microsoft.com"
  RegExp. 3//":80"3//返回":80"egExp.$4 //返回"/scripting/default.html"
  myArray  //返回myArray[0]=" http://msdn.microsoft.com:80/scripting/default.html",
      myArray[1]="http",myArray[2]="msdn.microsoft.com",
      myArray[3]=":80",myArray[4]="/scripting/default.html"
  myArray.input //返回“ http://msdn.microsoft.com:80/scripting/default.html"
  myArray.index //返回0
  myArray.lastIndex //返回51


  
example2(设置了全局标志)
  
  

 程序代码
var url=" http://msdn.microsoft.com:80/scripting/default.html";
  var reg=/(\w+):\/\/([^\/:]+)(:\d*)?([^#]*)/g;
  var myArray=url.match(reg);
  RegExp. 1//"http"RegExp.1//返回"http"RegExp.2 //返回"msdn.microsoft.com"
  RegExp. 3//":80"3//返回":80"egExp.$4 //返回"/scripting/default.html"
  myArray  //返回myArray=" http://msdn.microsoft.com:80/scripting/default.html"
  myArray.input //返回“ http://msdn.microsoft.com:80/scripting/default.html"
  myArray.index //返回0
  myArray.lastIndex //返回51


  
注意设置了全局标志后区别
  如果没有设置全局标志(g),数组的0元素包含整个匹配,而第1到n元素包含了匹配中曾出现过的任一个子匹配。
  这相当于没有设置全局标志的exec方法。如果设置了全局标志,元素0到n中包含所有匹配

3 exex方法

用正则表达式模式在字符串运行查找,并返回包含该查找结果的一个数组。

 程序代码
rgExp.exec(str)



如果exec方法没有找到匹配,则它返回null。
如果它找到匹配,则exec方法返回一个数组,并且更新全局RegExp对象的属性,以反映匹配结果。
数组的0元素包含了完整的匹配,而第1到n元素中包含的是匹配中出现的任意一个子匹配。
这相当于没有设置全局标志(g)的match方法。

如果为正则表达式设置了全局标志,exec从以lastIndex的值指示的位置开始查找。
如果没有设置全局标志,exec忽略lastIndex的值,从字符串的起始位置开始搜索。

exec方法返回的数组 有三个属性,分别是input、index、lastIndex。
Input属性包含了整个被查找的字符串。
Index属性中包含了整个被查找字符串中被匹配的子字符串的位置。
LastIndex属性中包含了匹配中最后 一个字符的下一个位置。

example1(没有设置全局标志)

  

 程序代码
var url=" http://msdn.microsoft.com:80/scripting/default.html";
  var reg=/(\w+):\/\/([^\/:]+)(:\d*)?([^#]*)/;
  var myArray=reg.exec(url);
  RegExp. 1//"http"RegExp.1//返回"http"RegExp.2 //返回"msdn.microsoft.com"
  RegExp. 3//":80"3//返回":80"egExp.$4 //返回"/scripting/default.html"
  myArray  //返回myArray[0]=" http://msdn.microsoft.com:80/scripting/default.html",
      myArray[1]="http",myArray[2]="msdn.microsoft.com",
      myArray[3]=":80",myArray[4]="/scripting/default.html"
  myArray.input //返回“ http://msdn.microsoft.com:80/scripting/default.html"
  myArray.index //返回0
  myArray.lastIndex //返回51


  
  没有设置全局标志(g)时,match方法和exec方法相同
  
example2(设置全局标志)
    
  

 程序代码
var url=" http://msdn.microsoft.com:80/scripting/default.html";
  var reg=/(\w+):\/\/([^\/:]+)(:\d*)?([^#]*)/;
  var myArray=reg.exec(url);
  RegExp. 1//"http"RegExp.1//返回"http"RegExp.2 //返回"msdn.microsoft.com"
  RegExp. 3//":80"3//返回":80"egExp.$4 //返回"/scripting/default.html"
  myArray  //返回myArray[0]=" http://msdn.microsoft.com:80/scripting/default.html",
      myArray[1]="http",myArray[2]="msdn.microsoft.com",
      myArray[3]=":80",myArray[4]="/scripting/default.html"
  myArray.input //返回“ http://msdn.microsoft.com:80/scripting/default.html"
  myArray.index //返回0
  myArray.lastIndex //返回51


   
4 search方法

返回与正则表达式查找内容匹配的第一个子字符串的位置。

 程序代码
stringOjb.search(rgExp)



search方法指明是否存在相应的匹配 。
如果找到一个匹配,search方法将返回一个整数值,指明这个匹配距离字符串开始的偏移位置。
如果没有找到匹配,则返回-1。
  
example1

  

 程序代码
var url=" http://msdn.microsoft.com:80/scripting/default.html";
  var reg=/(\w+):\/\/([^\/:]+)(:\d*)?([^#]*)/;
  var flag=url.search(reg);
  flag  //返回0
  RegExp. 1//"http"RegExp.1//返回"http"RegExp.2 //返回"msdn.microsoft.com"
  RegExp. 3//":80"3//返回":80"egExp.$4 //返回"/scripting/default.html"


  
  search和test方法都不能更新全局RegExp对象,所以RegExp.input,RegExp.index,RegExp.lastIndex返回undefined
  

5 replace方法

返回根据正则表达式进行文字替换后的字符串的复制

能更新全局RegExp对象


本文转自艾伦 Aaron博客园博客,原文链接:http://www.cnblogs.com/aaronjs/archive/2011/10/29/2228369.html,如需转载请自行联系原作者

相关文章
|
11月前
|
JavaScript 前端开发 编译器
js开发: 请解释什么是Babel,以及它在项目中的作用。
**Babel是JavaScript编译器,将ES6+代码转为旧版JS以保证兼容性。它用于前端项目,功能包括语法转换、插件扩展、灵活配置和丰富的生态系统。Babel确保新特性的使用而不牺牲浏览器支持。** ```markdown - Babel: JavaScript编译器,转化ES6+到兼容旧环境的JS - 保障新语法在不同浏览器的运行 - 支持插件,扩展编译功能 - 灵活配置,适应项目需求 - 富强的生态系统,多样化开发需求 ```
78 4
|
11月前
|
开发框架 JavaScript 安全
js开发:请解释什么是Express框架,以及它在项目中的作用。
【4月更文挑战第24天】Express是Node.js的Web开发框架,简化路由管理,支持HTTP请求处理。它包含中间件系统用于日志、错误处理和静态文件服务,集成多种模板引擎如EJS、Jade、Pug。框架还提供安全中间件提升应用安全,并具有良好的可扩展性,便于项目功能扩展和开发效率提升。
178 3
|
11月前
|
存储 JavaScript 索引
js开发:请解释什么是ES6的Map和Set,以及它们与普通对象和数组的区别。
ES6引入了Map和Set数据结构。Map的键可以是任意类型且有序,与对象的字符串或符号键不同;Set存储唯一值,无重复。两者皆可迭代,支持for...of循环。Map有get、set、has、delete等方法,Set有add、delete、has方法。示例展示了Map和Set的基本操作。
128 3
|
11月前
|
存储 JavaScript 前端开发
解释 JavaScript 中的作用域和作用域链的概念。
【4月更文挑战第4天】JavaScript作用域定义了变量和函数的可见范围,静态决定于编码时。每个函数作为对象拥有`scope`属性,关联运行期上下文集合。执行上下文在函数执行时创建,定义执行环境,每次调用函数都会生成独特上下文。作用域链是按层级组织的作用域集合,自内向外查找变量。变量查找遵循从当前执行上下文到全局上下文的顺序,若找不到则抛出异常。
74 6
|
11月前
|
缓存 JavaScript 前端开发
js开发:请解释什么是Webpack,以及它在项目中的作用。
Webpack是开源的JavaScript模块打包器,用于前端项目构建,整合并优化JavaScript、CSS、图片等资源。它实现模块打包、代码分割以提升加载速度,同时进行资源优化和缓存。借助插件机制扩展功能,并支持热更新,加速开发流程。
84 4
|
11月前
|
缓存 JavaScript 数据安全/隐私保护
js开发:请解释什么是ES6的Proxy,以及它的用途。
`ES6`的`Proxy`对象用于创建一个代理,能拦截并自定义目标对象的访问和操作,应用于数据绑定、访问控制、函数调用的拦截与修改以及异步操作处理。
102 3
|
11月前
|
JavaScript
js开发:请解释什么是ES6的类(class),并说明它与传统构造函数的区别。
ES6的类提供了一种更简洁的面向对象编程方式,对比传统的构造函数,具有更好的可读性和可维护性。类使用`class`定义,`constructor`定义构造方法,`extends`实现继承,并可直接定义静态方法。示例展示了如何创建`Person`类、`Student`子类以及它们的方法调用。
137 2
|
11月前
|
开发框架 JavaScript 安全
js开发:请解释什么是Express框架,以及它在项目中的作用。
Express是Node.js的Web开发框架,简化路由管理,支持HTTP请求处理。它采用中间件系统增强功能,如日志和错误处理,集成多种模板引擎(EJS、Jade、Pug)用于HTML渲染,并提供安全中间件提升应用安全性。其可扩展性允许选用合适插件扩展功能,加速开发进程。
124 1
|
11月前
|
JavaScript 前端开发
js开发:请解释事件冒泡和事件捕获。
JavaScript中的事件处理有冒泡和捕获两种方式。事件冒泡是从子元素向上级元素传递,而事件捕获则从外层元素向内层传递。`addEventListener`的第三个参数可设定事件模式,`false`或不设为冒泡,`true`为捕获。示例代码展示了如何设置。
76 2
|
10月前
|
JavaScript 程序员 索引
老程序员分享:JS基础知识(正则)
老程序员分享:JS基础知识(正则)
40 0
下一篇
oss创建bucket