js谜之正则表达式

前言

很久以前就说要写一篇正则表达式的文章,正则表达式老是记了又忘,忘了再记,记了再忘,卒。
言归正传,今天终于要研究一下这个谜同样的正则表达式了。其实正则表达式并不难(真的吗?orz)
本文转自本人博客:http://lsxj615.com/2016/08/15...正则表达式

为何要用正则表达式

在学习以前,咱们须要弄明白,到底何时须要用到正则表达式,正则表达式的用途到底是什么?
好比说,你正在搜索一个文件,这个文件里面包含单词car(不区分大小写),可是呢你又不想把包含字符串car的其余单词(例如carry)也一块儿找出来,那么这个时候你就可使用正则表达式来帮你解决问题。固然,这只是众多场景中的一种。正则表达式功能强大,能够帮你解决各类匹配文本问题。又或者表单验证的方式,也可使用正则表达式来解决。express

正则表达式是什么

简单来讲,正则表达式就是字符串,是用来匹配和处理文本的字符串。用正则表达式语言建立的。数组

正则表达式的语法

匹配字符

  • .(英文句号):匹配任何一个单个字符浏览器

  • []:匹配集合内多个字符中的某个字符
    e.g. [ns]a --> 匹配 na 或sa函数

  • [-]:匹配该区间内的字符
    e.g. [a-z] , [0-9]工具

  • ^ 取非匹配:除了该字符集内的字符,均可以匹配。只有当^出如今[]之间,且紧跟在[后面,才能发挥取非的做用。
    e.g. [^0-9] 匹配非数字的字符学习

使用元字符

元字符:在正则表达式中有特殊含义的字符。若须要表示该字符自己,需使用\转义。code

  • \d 任何一个数字字符,至关于[0-9]对象

  • \D 任何一个非数字字符,至关于1ip

  • \w 任何一个字母数字字符或下划线字符,至关于[a-zA-Z0-9_]

  • \W 任何一个非字母数字字符或非下划线字符,至关于2

  • \s 任何一个空白字符,等价于[fnrtv]

  • \S 任何一个非空白字符,等价于3

总而言之,小写字母与大写字母都是相反的,因此记住小写字母的含义,大写字母则是对应的取非含义。

重复匹配

  • ? 0个或1个字符
    e.g. [0-9]? 出现0次或一次,且最多只能出现1次数字。

  • + 一个或多个字符
    e.g. [0-9]+ 表示一个或多个连续的数字

  • * 0个或多个字符
    e.g. [0-9]* 连续出现0次货屡次的数字

  • {n} 设置一个精确的重复的值
    e.g. [0-9]{3} 三个数字

  • {min,max} 设置重复次数的最小值和最大值
    e.g. [0-9]{2,4} 最少2个数字,最多4个数字

  • {min, } 设置重复次数的最小值
    e.g. [0-9]{2,} 最少2个数字

懒惰型匹配

为了防止出现重复匹配形成的过分匹配,由于*+都是“贪婪型”元字符,它们在进行匹配时会尽量从一段文本的开头一直匹配到这段文本的末尾,而不是碰到第一个匹配就结束。

那么这个时候就须要使用"懒惰型"。仅需在贪婪型元字符后加上?便可。如:*?,+?,{n,}?

位置匹配

  • \b 单词边界

  • \B 非单词边界。查找先后都有多余空格的连字符。

  • ^ 字符串开头。出如今字符集合的外面且位于一个模式的开头,^匹配字符串的开头

  • $ 字符串结尾


Javascript中的正则表达式

ECMAScript经过RegExp类型来支持正则表达式。

var expression = / pattern / flags;

其中pattern能够是任何简单或复杂的正则表达式。
flags用来标明正则表达式的行为。以下所示:

  • g : 全局模式。模式应用于全部的字符串,不是在发现第一个匹配项后就当即中止的。

  • i : 不区分大小写。正则表达式默认是区别大小写的。i则是忽略大小写

  • m : 表示多行模式,也就是说到达一行文本末尾的时候还会继续查找下一行中是否存在与模式匹配的项。

建立正则表达式的方式

  • 字面量形式来定义
    var pattern = /sxj/i;

  • 使用RegExp构造函数
    var pattern = new RegExp("sxj", "i");

那么这两种方式的区别除了形式不同,还有一个差异在于:
ECMAScript 3中,正则表达式字面量始终会共享同一个RegExp实例;而使用构造函数建立的每个实例都是一个实例。

不过!【敲黑板!】ECMAScript 5明确规定了,使用正则表达式字面量必须想直接调用RegExp构造函数同样,每次都建立新的RegExp实例。而各大浏览器也对此进行了修改。

RegExp实例

实例属性

  • global: 布尔值,表示是否设置了g标志

  • ignoreCase: 布尔值,表示是否设置了i标志

  • multiline: 布尔值,表示是否设置了m标志

  • lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从0开始。

  • source: 正则表达式的字符串表示。按照字面量形式返回。

实例方法

exec()
pattern.exec(text);

查找text中的匹配项。

//例子
var pattern = /sxj/i;
var text = "sxj is a good student sxj haha";
console.log(pattern.exec(text));
//["sxj", index: 0, input: "sxj is a good student sxj haha"]
var pattern2 = /shi/i;
console.log(pattern2,exec(text));//null

从上述例子能够发现,若找到,则返回一个数组,该数组包含第一个匹配项,除此以外,还有两个属性:index(匹配项在字符串中的位置),input(应用正则表达式的字符串)。若没有匹配项返回null

对于exec而言,不管是否设置g全局标志,每次也只会返回一个匹配项。可是若是在同一个字符串上屡次调用,设置了g标志则会继续查找新的匹配项,而没有设置的话只会返回第一个匹配项信息。除此以外,pattern的lastIndex属性在全局模式会增长,非全局模式始终不变。

test()
pattern.test(text);

查看目标字符串与该模式是否匹配。匹配返回true,不然返回false。

String中的正则表达式

match()
text.match(pattern);

match匹配一个字符串和一个正则表达式。若没有g标识,则结果与pattern.exec(text)相同。如有g标志,则返回一个包含全部匹配的数组。

search()
text.search(pattern);

若找到匹配,返回第一个匹配的首字符位置。若没有找到返回-1。
此方法会忽略g标识,且没有position参数。

replace()
string.replace(searchValue, replaceValue);

searchValue能够是一个字符串或一个正则表达式对象。如果一个字符串,只会在第一次出现的地方被替换。如果一个正则表达式,如有g标志则替换全部匹配之处,若没有则只替换第一个匹配之处。

总结

正则表达式是个很是好用的工具,若掌握了可达到事半功倍的效果。好好学哟~


  1. 0-9
  2. a-zA-Z0-9_
  3. fnrtv
相关文章
相关标签/搜索