正则表达式学习笔记

慕课网学习的正则表达式的用法,下面是一些笔记以防遗忘。

工具

在线图形化工具http://regexper.com

实例化RegExp对象

  • 字面量
    var reg = /\bis\b/g; \b代表单词边界。
  • 构造函数
    var reg = new RegExp('\\bis\\b','g')

修饰符

  • g:global 全文搜索,不添加则默认搜索到第一个停止
  • i:ignore case 忽略大小写,默认的大小写敏感
  • m:mulitple lines 多行搜索

元字符

  • 正则表达式由两种基本字符类型组成:
    • 原意文本字符
    • 元字符
  • 元字符是在正则表达式中有特殊含义的非字母字符
    • * + ? $ ^ . | \ () [] {}
字符 含义
\t 水平制表符
\v 垂直制表符
\n 换行符
\r 回车符
\0 空字符
\f 换页符
\cX 与X对应的控制字符(Ctrl+X)

字符类

[]构建字符类

字符类取反

中括号中,最前面写^时,代表取反,[^ab]表示不是a或b的其他字符。

范围类

[a-z],[0-9]等等,可以连写:[a-zA-Z]
如果要匹配里面的横杠-,可以在后面加一个横杠-[0-9-]

预定义类

字符 等价类 含义
. [^\r\n] 除了回车符和换行符之外的所有字符
\d [0-9] 数字字符
\D [^0-9] 非数字字符
\s [\t\n\x0B\f\f] 空白符
\S [^\t\n\x0B\f\f] 非空白符
\w [a-zA-Z_0-9] 单词字母(字母数字下划线)
\W [^a-zA-Z_0-9] 非单词字符

边界

字符 含义
^ 以xxx开始
$ 以xxx结束
\b 单词边界
\B 非单词边界

量词

字符 含义
? 最多出现一次
+ 至少出现一次
* 任意次
{n} 出现n次
{n,m} 出现n到m次
{n,} 至少出现n次

贪婪模式和非贪婪模式

正则表达式的匹配模式有:贪婪模式,非贪婪模式。默认模式为贪婪模式,设置非贪婪模式需要在量词后面添加疑问号?
例如:
'123456789'.match(/\d{3,6}?/g) 匹配结果为 ['123','456','789']

分组

使用() ,忽略分组:(?:)。忽略分组的意思是说,虽然分了组,但是不能通过$来获取改组的内容。

|实现或:'abdacd'.replace(/a(b|c)d/g,'X') => "XX"

反向引用、分组捕获

$1$2捕获分组:

1
'2017-03-11'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$3-$2-$1') => "11-03-2017"

前瞻

正则表达式从文本头部向尾部开始解析,文本尾部方向称为前。
前瞻:匹配某个正则之后,后面的匹配规则。
正向前瞻:(/\w(?=\d)/)

1
2
'a1bc'.replace(/\w(?=\d)/g,'X');
=>"X1bc"

负向前瞻:(/\w(?!\d)/)

1
2
'a1bc'.replace(/\w(!=\d)/g,'X');
=>"aXXX"

对象属性

g是否全文搜索
i是否大小写敏感
m是否多行搜索
l当前表达式匹配内容的最后一个字符的下一个位置
s正则表达式的文本内容

方法

  • test
    RegExp.prototype.test(str)
    用于测试字符串参数中是否存在匹配正则表达式模式的字符串,如果存在则返回true,否则返回false。
    lastIndex 记录当前匹配结果的、最后一个字符的、下一个字符的位置。
    注意:test()方法在匹配的时候当匹配到一个结果时,会从lastIndex位置开始匹配下一个结果,直到不存在的时候才置为0。因此,当使用全局g属性标识时,当匹配到最后一个结果时,lastIndex值指向不存在的位置,此时再执行test()会返回false。

例子:多次执行test()方法,会在true、false之间循环。
(/\w/g).test('a')每次执行都是正确的,但是通过实例化对象,需要很大的开销。
test()方法:原意就是测试有没有、能不能匹配上,当使用test原意时,没必要加g。

  • exec
    RegExp.prototype.exec(str)
    使用正则表达式模式对字符串执行搜索,并将更新全局RegExp对象的属性一反映匹配结果。
    如果没有匹配的文本则返回 null,否则返回一个结果数组:

    • index 声明匹配文本的第一个字符位置
    • input 存放被检索的字符串 string
  • 非全局调用
    调用非全局的RegExp对象的exec()时,返回数组:
    第一个元素是与正则表达式相匹配的文本;
    第二个元素是与RegExpObject的第一个子表达式相匹配的文本(如果有的话);
    第三个元素是与RegExp对象的第二个子表达式相匹配的文本(如果有的话),以此类推。

字符串对象方法

  • search
    String.prototype.search(reg)
    search()方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。
    方法返回第一个匹配结果 index,查找不到返回 -1
    search()并不执行全局匹配,它将忽略标志g ,并且总是从字符串的开始进行检索

    1
    'A11B2C3D4'.search(/\d/) =>  1
  • match
    String.prototype.match(reg)
    match()方法将检索字符串,以找到一个或多个与RegExp匹配的文本。
    RegExp是否具有标志g对结果影响跟大。

  • 非全局调用,即没有 g:
    如果RegExp没有标志 g,那么 match()方法就只能在字符串中执行一次匹配;
    如果没有找到任何匹配的文本,将返回null;
    否则它将返回一个数组,其中存放了与它找到的匹配文本有关的信息;
    返回数组的第一个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本;
    除了常规的数组元素之外,返回的数组还含有2个对象属性:
    -index 声明匹配文本的起始字符在字符串的位置。
    -input 声明对 stringObject的引用。

  • 全局调用
    如果RegExp具有标志 g,则match()方法将执行全局检索,找到字符串中的所有匹配子字符串。
    没有找到任何匹配的子串,则返回null。
    如果找到了一个或多个匹配的子串,则返回一个数组。
    数组元素中存放地字符串中所有的匹配子串,而且也没有index 属性或input属性。

  • replace
    String.prototype.replace(str,replaceStr) String.prototype.replace(reg,replaceStr) String.prototype.replace(reg,function)
    function参数含义
    function会在每次匹配替换的时候调用,有四个参数:
    1、匹配字符串
    2、正则表达式分组内容,没有分组则没有该参数
    3、匹配项在字符串中 index
    4、原字符串

  • split

0%