C++(VS2013编译器):http://msdn.microsoft.com/zh-cn/library/bb982727.aspx#grammarsummary

Java:              http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

JavaScript:         http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp

这儿主要是JS中的正则表达式:

  1. 正则表达式是用于匹配字符串中字符组合的模式。 一种几乎可以在所有的程序设计语言里和所有的计算机平台上使用的文字处理工具。它可以用来查找(搜索)特定的信息,也可以用来查找并编辑(替换)特定的信息。

  2. 核心是匹配,匹配位置或者匹配字符。

  3. 在 JavaScript 中,正则表达式也是对象。

  4. 这些模式被用于 RegExp 的 exec 和 test 方法, 以及 String 的 matchreplacesearch 和 split 方法。

二. 创建正则表达式

2.1 正则表达式的创建可以有以下三种方法。

2.1.1 字面量

/pattern/flags

  1. let reg1 = /jing ke tong xue/g;
  2. console.log(reg1); // /jing ke tong xue/g
2.1.2 构造函数

new RegExp(pattern [, flags])

  1. let reg2 = new RegExp('jing ke tong xue', 'g');
  2. console.log(reg2); // /jing ke tong xue/g
2.1.3 工厂符号

RegExp(pattern [, flags])

  1. let reg3 = RegExp('jing ke tong xue', 'g');
  2. console.log(reg3); // /jing ke tong xue/g

2.2 字面量、构造函数、工厂符号在创建正则表达式中的异同

2.2.1 共同点

三种方法都可以创建正则表达式,正则表达式的文本pattern为必须参数,标志符flagsg、i、m、y、u五个可选、可任意搭配参数。

g:(global) 全局模式,即模式将应用于所有的字符串,而非发现第一个匹配项时立即停止;
i: (case-insensitive) 表示不区分大小写模式
m: (multiline)表示多行模式,即在文本的末尾时会继续查找下一行是否存在于模式匹配的项
2.2.2 不同点

构造函数和工厂符号除了相差一个new关键字外没有什么不同,但是不推荐工厂符号的形式创建正则表达式。下面主要说一下字面量和构造函数的形式创建正则表达式的不同之处。

  1. 当表达式被赋值时,字面量形式提供正则表达式的编译(compilation)状态,当正则表达式保持为常量时使用字面量。例如当你在循环中使用字面量构造一个正则表达式时,正则表达式不会在每一次迭代中都被重新编译(recompiled)

  2. 正则表达式对象的构造函数,如new RegExp('jing ke tong xue')提供了正则表达式运行时编译(runtime compilation)。如果你知道正则表达式模式将会改变,或者你事先不知道什么模式,而是从另一个来源获取,如用户输入,这些情况都可以使用构造函数。

  3. ECMAScript 6开始,当第一个参数为正则表达式而第二个标志参数存在时,new RegExp(/jing ke tong xue/, 'g')不再抛出==TypeError== (“当从其他正则表达式进行构造时不支持标志”)的异常,取而代之,将使用这些参数创建一个新的正则表达式。

  4. 字面量方式pattern中所有字符都是元字符,所以不能进行变量值的拼接。通过构造函数的方式pattern中所有字符都是字符串,是可以进行字符串拼接的,同时对于特殊字符也是需要转义的。

  • 字符串变量拼接
  1. const name = 'jing ke';
  2. // 字符串拼接不会成功
  3. let reg1 = /" + name + " tong xue/g;
  4. console.log(reg1); // /" + name + " tong xue/g
  5. // 字符串拼接可以成功
  6. let reg2 = new RegExp(name + ' tong xue', 'g');
  7. console.log(reg2); // /jing ke tong xue/g
  • 特殊字符转义
  1. const name = 'jing ke';
  2. // 匹配name,这里jing和ke之间可能有1个或多个空格
  3. let reg1 = /jing\s+ke/g;
  4. console.log(reg1); // /jing\s+ke/g
  5. console.log(reg1.test(name)); // true
  6. // 这里创建的正则表达式和字面量方式创建的结果并不一样
  7. let reg2 = new RegExp('jing\s+ke', 'g');
  8. console.log(reg2); // /jings+ke/g
  9. console.log(reg2.test(name)); // false
  10. // 这里我把reg3稍稍改造了一下,结果就和reg1一样了
  11. let reg3 = new RegExp('jing\\s+ke', 'g');
  12. console.log(reg3); // /jing\s+ke/g
  13. console.log(reg3.test(name)); // true

再看一个特殊字符转义的例子

  1. // 写一个正则表达式匹配反斜杠 \
  2. const str = '\\'; // 这里str就是 \,反斜杠有特殊意义,下文介绍基本元字符会讲
  3. // 字面量方式
  4. let reg1 = /\\/g;
  5. console.log(reg1); // /\\/g
  6. console.log(reg1.test(str)); // true
  7. // 为什么是4个反斜杠,详见下文元字符介绍。自己在控制台试试1个,2个,3个会报什么错
  8. let reg2 = new RegExp('\\\\', 'g');
  9. console.log(reg2); // /\\/g
  10. console.log(reg2.test(str)); // true

三. 正则表达式中特殊字符

3.1 标志字符

标志字符 含义
g 全局匹配,找到所有匹配,而不是在第一个匹配后停止。
i 忽略大小写。
m 多行,将开始和结束字符(^和$)视为在多行上工作(也就是,分别匹配每一行的开始和结束(由 \n 或 \r 分割),而不只是只匹配整个输入字符串的最开始和最末尾处。
u ES6新增,Unicode,将模式视为Unicode序列点的序列。
y ES6新增,粘性匹配,仅匹配目标字符串中此正则表达式的lastIndex属性指示的索引(并且不尝试从任何后续的索引匹配)。

3.2 基本元字符

基本元字符 含义
. 匹配除了换行符之外的任何单个字符
\ 在非特殊字符之前的反斜杠表示下一个字符是特殊的,不能从字面上解释。例如,没有前\b通常匹配小写b,无论它们出现在哪里。如果加了\,这个字符变成了一个特殊意义的字符,反斜杠也可以将其后的特殊字符,转义为字面量。例如,模式 /a*/ 代表会匹配0个或者多个a。相反,模式 /a\*/ 将*的特殊性移除,从而可以匹配像 a* 这样的字符串。
| 逻辑或操作符。
[...] 定义一个字符集合,匹配字符集合中的一个字符,在字符集合里面像 .\这些字符都表示其本身。
[^...] 对上面一个集合取非。
- 定义一个区间,例如[A-Z],其首尾字符在 ASCII 字符集里面。

3.3 数量元字符

量词 含义
* 等价于{0,},表示出现任意次,可以不出现。
+ 等价于{1,},表示至少出现一次,上不封顶。
? 等价于{0, 1}表示出现一次或零次。
{m} 等价于{m, m},标志正好出现m次,不能多也不能少。
{m,} 表示至少出现 m 次,上不封顶。

量词后面加?可以实现惰性匹配,对应关系如下:

贪婪量词 惰性量词
* *?
+ +?
? ??
{m} {m}?
{m,} {m,}?

3.4 锚字符(位置元字符)

字符 含义
^ 单独使用匹配表达式的开始。匹配字符串的开头,在多行检索中,匹配一行的开头。
$ 匹配表达式的结束。匹配字符串的结尾,在多行检索中,匹配一行的结尾。
\b 匹配一个单词的边界,简而言之,就是位于字符\w和字符\W之间的位置,或位于字符\w和字符串的开头或结尾之间的位置(但需要注意的是在字符组内[\b]匹配的是退格符)。
\B 匹配非单词边界。
(?=p) 匹配 p 前面的位置。零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符。
(?!p) 匹配不是 p 前面的位置。零宽负向先行断言,要求接下来的字符不与p匹配。

3.5 特殊元字符

字符 含义
\d 等价于[0-9],表示一位数字s。
\D 等价于[^0-9],表示一位非数字。除了ASCⅡ数字之外的任何字符。
\s 等价于[\t\v\n\r\f],表示空白符,包括空格,水平制表符(\t),垂直制表符(\v),换行符(\n),回车符(\r),换页符(\f)
\S 等价于[^\t\v\n\r\f],表示非空白符。
\w 等价于[0-9a-zA-Z],表示数字大小写字母和下划线。
\W 等价于[^0-9a-zA-Z],表示非单词字符。

四. 正则表达式的一些属性

4.1 RegExp.lastIndex

  • lastIndex 是正则表达式的一个可读可写的整型属性,用来指定下一次匹配的起始索引。

  • 只有正则表达式使用了表示全局检索的 "g" 标志时,该属性才会起作用。

如果 lastIndex 大于字符串的长度,则 regexp.test 和 regexp.exec 将会匹配失败,然后 lastIndex 被设置为 0。

如果 lastIndex 等于字符串的长度,且该正则表达式匹配空字符串,则该正则表达式匹配从 lastIndex 开始的字符串。

如果 lastIndex 等于字符串的长度,且该正则表达式不匹配空字符串 ,则该正则表达式不匹配字符串,lastIndex 被设置为 0。

否则,lastIndex 被设置为紧随最近一次成功匹配的下一个位置。

请看如下示例代码:

  1. const str = 'jing ke tong xue jing ke tong xue jing ke tong xue jing ke tong xue';
  2. let reg = /jing ke tong xue/g;
  3. // lastIndex从0开始
  4. console.log(reg.lastIndex); // 0
  5. console.log(reg.test(str)); // true
  6. console.log(reg.lastIndex); // 16
  7. console.log(reg.test(str)); // true
  8. console.log(reg.lastIndex); // 33
  9. // lastIndex可修改
  10. reg.lastIndex = 0;
  11. console.log(reg.lastIndex); // 0
  12. console.log(reg.test(str)); // true
  13. console.log(reg.lastIndex); // 16
  14. console.log(reg.test(str)); // true
  15. console.log(reg.lastIndex); // 33
  16. console.log(reg.test(str)); // false
  17. console.log(reg.lastIndex); // 50
  18. console.log(reg.test(str));// true
  19. console.log(reg.lastIndex); // 67
  20. console.log(reg.test(str));// false
  21. // 上一次匹配失败,lastIndex重置为0
  22. console.log(reg.lastIndex); // 0
  23. console.log(reg.test(str));// true

4.2 RegExp.prototype.global

  • global属性表明正则表达式是否使用了 "g" 标志。

  • global的值是布尔对象,如果使用了 "g" 标志,则返回true;否则返回false。 "g" 标志意味着正则表达式应该测试字符串中所有可能的匹配。

  • global是一个正则表达式实例的只读属性。RegExp.prototype.globalwritableenumerableconfigurable属性均为false,无法直接更改此属性。

请看如下示例代码:

  1. let reg1 = /jing ke tong xue/;
  2. console.log(reg1.global); // false.
  3. let reg2 = /jing ke tong xue/g;
  4. console.log(reg2.global); // true

4.3 RegExp.prototype.ignoreCase

  • ignoreCase属性表明正则表达式是否使用了 "i" 标志。

  • ignoreCase的值是布尔对象,如果使用了"i" 标志,则返回true;否则,返回false。"i"标志意味着在字符串进行匹配时,应该忽略大小写。
  • ignoreCase是正则表达式实例的只读属性。RegExp.prototype.ignoreCasewritableenumerableconfigurable属性均为false,无法直接更改此属性。

请看如下示例代码:

  1. let reg1 = /jing ke tong xue/;
  2. console.log(reg1.ignoreCase); // false.
  3. let reg2 = /jing ke tong xue/i;
  4. console.log(reg2.ignoreCase); // true

4.4 RegExp.prototype.multiline

  • multiline属性表明正则表达式是否使用了 "m" 标志。

  • multiline的值是布尔对象,如果使用了"m" 标志,则返回true;否则,返回false。"m" 标志意味着一个多行输入字符串被看作多行。

  • multiline是正则表达式实例的一个只读属性。RegExp.prototype.multilinewritableenumerableconfigurable属性均为false,无法直接更改此属性。

请看如下示例代码:

  1. let reg1 = /jing ke tong xue/;
  2. console.log(reg1.multiline); // false.
  3. let reg2 = /jing ke tong xue/m;
  4. console.log(reg2.multiline); // true

4.5 RegExp.prototype.unicode

  • unicode属性表明正则表达式带有"u" 标志。

  • unicode的值是Boolean,并且如果使用了 "u" 标志则为true;否则为false。"u" 标志开启了多种Unicode相关的特性。使用 "u" 标志,任何Unicode 代码点的转义都会被解释。

  • unicode是正则表达式独立实例的只读属性。RegExp.prototype.unicodewritableenumerable属性为falseconfigurable属性均为true,无法直接更改此属性。

请看如下示例代码:

  1. let reg1 = /jing ke tong xue/;
  2. console.log(reg1.unicode); // false.
  3. let reg2 = /jing ke tong xue/u;
  4. console.log(reg2.unicode); // true

再看如下示例代码:

  1. // 定义一个四个字节的 UTF-16 编码的字符
  2. const str = '\uD83D\uDC2A';
  3. let reg1 = /^\uD83D/;
  4. // ES5不支持四个字节的 UTF-16 编码,会将其识别为两个字符,故而输出 true
  5. console.log(reg1.test(str)); // true
  6. let reg2 = /^\uD83D/u;
  7. // 加了u修饰符以后,ES6 就会识别其为一个字符,故而输出false
  8. console.log(reg2.test(str)); // false

4.6 RegExp.prototype.sticky

  • sticky属性表明正则表达式带有"y" 标志。

  • sticky的值是 Boolean ,并且如果使用了"y"标志则为true;否则为false。"y" 标志指示搜索是否具有粘性,仅从正则表达式的lastIndex 属性表示的索引处为目标字符串匹配(并且不会尝试从后续索引匹配)。

  • sticky是正则表达式独立实例的只读属性。RegExp.prototype.stickywritableenumerable属性为falseconfigurable属性均为true,无法直接更改此属性。

请看如下示例代码:

  1. let reg1 = /jing ke tong xue/;
  2. console.log(reg1.sticky); // false.
  3. let reg2 = /jing ke tong xue/y;
  4. console.log(reg2.sticky); // true

再看如下示例代码:

  1. const str = 'test jing ke tong xue test jing ke tong xue';
  2. let reg1 = /jing ke tong xue/;
  3. // 没有y标识符,lastIndex始终为0,但是reg1并不具有粘性,并不从lastIndex号为开始
  4. console.log(reg1.lastIndex); // 0
  5. console.log(reg1.test(str)); // true
  6. reg1.lastIndex = 5;
  7. console.log(reg1.lastIndex); // 5
  8. console.log(reg1.test(str)); // true
  9. // 由于没有y标识符,在正则表达式匹配之后,lastIndex又被重置为0
  10. console.log(reg1.lastIndex); // 0
  11. console.log(reg1.test(str)); // true
  12. let reg2 = /jing ke tong xue/y;
  13. // 第一次匹配将从0号位开始
  14. console.log(reg2.lastIndex); // 0
  15. console.log(reg2.test(str)); // false
  16. // 第二次一次匹配将从5号位开始
  17. reg2.lastIndex = 5;
  18. console.log(reg2.lastIndex); // 5
  19. console.log(reg2.test(str)); // true
  20. // 下一次匹配将从21号位开始
  21. console.log(reg2.lastIndex); // 21
  22. console.log(reg2.test(str)); // false
  23. // 上一次匹配失败,lastIndex重置为0;下一次匹配将从0号位开始
  24. console.log(reg2.lastIndex);

4.7 RegExp.prototype.source

  • source 属性返回一个值为当前正则表达式对象的模式文本的字符串。该字符串不会包含正则字面量两边的斜杠以及任何的标志字符。

请看如下示例代码:

  1. let reg = /jing ke tong xue/gimuy;
  2. console.log(reg.source); // jing ke tong xue
  3. // source无法被修改,不会生效
  4. reg.source = 'tong xue jing ke';
  5. console.log(reg); // /jing ke tong xue/gimuy

4.8 RegExp.prototype.flags

  • flagsES6新增属性,返回一个由当前正则表达式对象的标志组成的字符串。

  • 标志以字母表顺序排序。(从左到右gimuy)。

  • flags是正则表达式独立实例的只读属性。RegExp.prototype.flagswritableenumerable属性为falseconfigurable属性均为true,无法直接更改此属性。

请看如下示例代码:

  1. let reg = /jing ke tong xue/gimuy;
  2. console.log(reg.flags); // jing ke tong xue
  3. // flags无法被修改,不会生效
  4. reg.flags = 'g';
  5. console.log(reg); // /jing ke tong xue/gimuy

flags属性为ES6新增属性,ES6以前可用如下Polyfill。

  1. if (RegExp.prototype.flags === undefined) {
  2. Object.defineProperty(RegExp.prototype, 'flags', {
  3. writable: false, // 默认为false,写上便于理解
  4. enumerable: false, // 默认为false,写上便于理解
  5. configurable: true,
  6. get: function() {
  7. return this.toString().match(/[gimuy]*$/)[0];
  8. }
  9. });
  10. }

五. 正则表达式的一些方法

5.1 RegExp.prototype.test

  • 语法 reg.test(str)str:用来与正则表达式匹配的字符串。

  • test() 方法执行一个检索,用来查看正则表达式与指定的字符串是否匹配。

  • 如果正则表达式与指定的字符串匹配 ,返回true,否则false

  1. const str = 'jing ke tong xue';
  2. let reg1 = /^jing/;
  3. // 判断str是不是以jing开头
  4. console.log(reg1.test(str)); // true
  5. let reg2 = /^ke/;
  6. // 判断str是不是以ke开头
  7. console.log(reg2.test(str)); // fase

在设置有全局标志g的正则使用test方法。

如果正则表达式设置了全局标志,test方法的执行会改变正则表达式的 lastIndex 属性。连续的执行test方法,后续的执行将会从 lastIndex 处开始匹配字符串。如果 test 方法返回匹配失败 false,lastIndex 属性将会被重置为0。

  1. const str = 'jing ke tong xue jing ke tong xue jing ke tong xue';
  2. let reg = /jing ke/g;
  3. console.log(reg.lastIndex); // 0
  4. console.log(reg.test(str)); // true
  5. console.log(reg.lastIndex); // 7
  6. console.log(reg.test(str)); // true
  7. console.log(reg.lastIndex); // 24
  8. console.log(reg.test(str)); // true
  9. console.log(reg.lastIndex); // 41
  10. console.log(reg.test(str)); // false
  11. console.log(reg.lastIndex); // 0

5.2 RegExp.prototype.exec

  • 语法reg.exec(str)str:要匹配正则表达式的字符串。 exec() 方法在一个指定字符串中执行一个搜索匹配。返回一个结果数组或 null

  • 如果匹配成功,exec() 方法返回一个数组,并更新正则表达式对象的属性。返回的数组将完全匹配成功的文本作为第一项,将正则括号里匹配成功的作为数组填充到后面。

  • 如果匹配失败,exec() 方法返回 null

C++、Java、JavaScript中的正则表达式的更多相关文章

  1. 转载 javascript中的正则表达式总结 一

    定义正则表达式的方法 定义正则表达式的方法有两种:构造函数定义和正则表达式直接量定义.例如: var reg1 = new RegExp('\d{5, 11}'); // 通过构造函数定义 var r ...

  2. JavaScript中的正则表达式(终结篇)

    JavaScript中的正则表达式(终结篇) 在之前的几篇文章中,我们了解了正则表达式的基本语法,但那些语法不是针对于某一个特定语言的.这篇博文我们将通过下面几个部分来了解正则表达式在JavaScri ...

  3. Javascript中的正则表达式

    Javascript中的正则表达式 刚开始接触正则表达式的时候,觉得这是个很死板的东西(没办法,计算机不能像人眼一样能很快的辨认出我们需要的结果,它需要一定的规则来对它进行限制),了解的越多,发现这个 ...

  4. 浅谈JavaScript中的正则表达式

    引言 对于正则表达式我想作为程序员肯定使用过它,那天书般的表达方式,我用一次就记住它了.这篇博客先介绍一些正则表达式的内容,然后介绍JavaScript中对正则表达式特有的改进.下面开始介绍正则表达式 ...

  5. 浅谈JavaScript中的正则表达式(适用初学者观看)

    浅谈JavaScript中的正则表达式 1.什么是正则表达式(RegExp)? 官方定义: 正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去 ...

  6. 精通 JavaScript中的正则表达式

    精通 JS正则表达式 (精通?标题党 ) 正则表达式可以: •测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式.这称为数据有效性验证  ...

  7. Java语言中的正则表达式

    正则表达式是什么? 正则表达式是一种强大而灵活的文本处理工具.初学正则表达式时,其语法是一个难点,但它确实是一种简洁.动态的语言.正则表达式提供了一种完全通用的方式,能够解决各种字符串处理相关的问题: ...

  8. JavaScript中的正则表达式详解

    摘要:javascript中的正则表达式作为相当重要的知识,本文将介绍正则表达式的相关知识和用法. 正则表达式(Regular Expression)是一门简单语言的语法规范,是强大.便捷.高效的文本 ...

  9. (译)JavaScript 中的正则表达式(RegEx)实操——快速掌握正则表达式,伴有随手可练的例子————(翻译未完待续)

    (原文:https://blog.bitsrc.io/a-beginners-guide-to-regular-expressions-regex-in-javascript-9c58feb27eb4 ...

随机推荐

  1. Android 解决手机unauthorized错误

    转自:http://blog.csdn.net/quicksand201/article/details/19190821 手机开发者选项中USB调试已经打开,在电脑命令行下输入adb devices ...

  2. UE打包32位程序遇到Win32 is not a supported platform for MindWaveEditor. Valid platforms are Win64.

    1>------ 已启动全部重新生成: 项目: MindWave, 配置: Development_Editor Win32 ------1> Win32 is not a support ...

  3. anguglar 2+ md5加密

    1.安装 npm install ts-md5 --save 2.使用 import {Md5} from "ts-md5/dist/md5"; constructor() {co ...

  4. Struts2的OGNL的用法

    1 <%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1 ...

  5. SaltStack远程执行-返回MySQL

    上一篇:SaltStack远程执行-模块 参考官方文档:https://docs.saltstack.com/en/latest/ref/returners/all/salt.returners.my ...

  6. 报错分析---->jsp自定义标签:Unable to load tag handler class

    Unable to load tag handler class 无法加载标签处理程序类 处理自定义标签的类中如下: 调用自定义标签的jsp中如下:

  7. Spark源码分析 – Executor

    ExecutorBackend 很简单的接口 package org.apache.spark.executor /** * A pluggable interface used by the Exe ...

  8. Android studio 使用技巧和问题

    最近更新Android studio版本到1.2.1.1后 出现了一些问题,首先一个就是创建一个项目后,布局文件会提示 找不到类. 网上找了下答案,原来是这个版本的bug. 其实解决起来很简单,找到 ...

  9. Golang&Python测试thrift

    接上篇,安装好之后,就开始编写IDL生成然后测试. 一.生成运行 参考 http://www.aboutyun.com/thread-8916-1-1.html 来个添加,查询. namespace ...

  10. Flask之session相关

    Flask的session简介 除请求对象之外,还有一个 session 对象.它允许你在不同请求间存储特定用户的信息.它是在 Cookies 的基础上实现的,并且对 Cookies 进行密钥签名要使 ...