JavaScript正则表达式

简介

正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),是计算机科学的一个概念。
正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。
在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
许多程序设计语言都支持利用正则表达式进行字符串操作。
正则表达式通常缩写成regex,单数有regexp、regex,复数有regexps、regexes、regexen。

历史

最初的正则表达式出现于理论计算机科学的自动控制理论和形式化语言理论中。在这些领域中有对计算(自动控制)的模型和对形式化语言描述与分类的研究。

1940年,沃伦·麦卡洛克与Walter Pitts将神经系统中的神经元描述成小而简单的自动控制元。

1950年代,数学家斯蒂芬·科尔·克莱尼利用称之为“正则集合”的数学符号来描述此模型。肯·汤普逊将此符号系统引入编辑器QED,随后是Unix上的编辑器ed,并最终引入grep。自此以后,正则表达式被广泛地应用于各种Unix或类Unix系统的工具中。正则表达式的POSIX规范,分为基本型正则表达式(Basic Regular Expression,BRE)和扩展型正则表达式(Extended Regular Express,ERE)两大流派。在兼容POSIX的UNIX系统上,grep和egrep之类的工具都遵循POSIX规范,一些数据库系统中的正则表达式也匹配POSIX规范。grep、vi、sed都属于BRE,是历史最早的正则表达式,因此元字符必须转译之后才具有特殊含义。egrep、awk则属于ERE,元字符不用转译

Perl的正则表达式源自于Henry Spencer于1986年1月19日发布的regex,它已经演化成了PCRE(Perl兼容正则表达式,Perl Compatible Regular Expressions,一个由Philip Hazel开发的,为很多现代工具所使用的库。

各编程语言之间关于正则表达式的集成,当前开发进展得很差。Perl6的子项目Apocalypse的设计中已考虑到了这点。


尽管目前计算机科学界仍未出现一个统一的正则表达式规范,但是我们仍然可以选择使用目前已经发展的可用的规范。
JavaScript使用的正则规范为Perl正则表达式规范。

创建正则对象

正则表达式在JavaScript中属于对象,类似于字符串既可以用var str = "这是一个字符串";var str = new String("这也是一个字符串");两种方式创建一个字符串对象,正则表达式也可以用/字符串/模式修饰符new RegExp("字符串", "模式修饰符")来创建一个正则表达式对象。

由上我们可知,正则表达式是由RegExp这个类所实例化得到的对象。
因此,若我们需要检测一个对象是否为正则表达式时,可以使用if (obj instanceof RegExp) {}得到答案。

模式修饰符

模式符 功能
g 用于在目标字符串中实现全局匹配
i 匹配时对大小写不敏感
m 实现多行匹配
u 以Unicode编码执行正则表达式
y 粘性匹配,仅匹配目标字符串中此正则表达式的lastindex属性指示的索引

特殊字符

字符 描述
$ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘\n’ 或 ‘\r’。要匹配 $ 字符本身,请使用 $。
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。
. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 \. 。
[ 标记一个中括号表达式的开始。要匹配 [,请使用 \[。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。
|将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\\‘ 匹配 “",而 ‘\(‘ 则匹配 “(“。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。
{ 标记限定符表达式的开始。要匹配 {,请使用 {。
| 指明两项之间的一个选择。要匹配 |,请使用 |。

限定符

字符 描述
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,’zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,”do(es)?” 可以匹配 “do” 、 “does” 中的 “does” 、 “doxy” 中的 “do” 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,’o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,’o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。’o{1,}’ 等价于 ‘o+’。’o{0,}’ 则等价于 ‘o*’。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,”o{1,3}” 将匹配 “fooooood” 中的前三个 o。’o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。

使用正则对象

在JavaScript中有两种方式使用正则对象:
第一种是使用RegExp类中的方法exec();
该方法接受一个字符串,返回一个数组代表匹配结果

1
2
3
var reg = /abc/i;
var str = "This is a String 'abc'!";
console.log(reg.exec(str));

输出["abc", index: 18, input: "This is a String 'abc'!", groups: undefined]
数组中第一个元素代表匹配到的字符串,index代表该字符串索引位置,input代表被匹配的字符串,groups代表分组。

第二种是使用String类中的方法match();
该方法接受一个正则对象,返回一个数组代表匹配结果

1
2
3
var reg = /abc/i;
var str = "This is a String 'abc'!";
console.log(str.match(reg));
人生不易,仓鼠断气