攻破难啃的骨头-正则表达式
很多Web开发人员在忽视正则表达式之后,还可以顺利的工作,但很多情况下,一句正确的正则表达式,很有可能省略半屏的代码。
正则表达式的解释
在JavaScript中,与大多数其他对象类型一样,有两种方法可以创建正则表达式:通过正则表达式字面量,或者通过构造RegExp对象的实例。
例如,如果要创建一个一般的正则表达式,用于精确匹配字符创“test”,可以使用正则字面量:
var pattern=/test/;
正斜杠可能看着有些奇怪,但是正如字符创是用引号进行界定一样,正则字面量是用正斜杠进行界定的。
或者,我们可以构造一个RegExp实例,将正则表达式作为字符串传入:
var pattern=new RegExp("test");
在开发过程中,如果正则是已知的,则优先选择字面量语法,而构造器方式则是用于在运行时,通过动态构建字符串来构建正则表达式。字面量语法优先于字符串的其中一个原因是反斜杠字符在普通字符串中也是一个转义字符,多以,我们要用\\来表示反斜杠。
除了表达式本身,还有三个标志可以与正则进行关联:
-
i:让正则表达式不区分大小写。
-
g:匹配模式中的所有实例,而不是默认只匹配第一次出现的结果。
-
m:允许匹配多个行。
这些标志将附加到字面量尾部(/test/ig)或者作为RegExp的第二个字符参数。
术语与操作符
匹配一类字符
-
[abc]:匹配a,b,c中的任何一个字符。
-
[^abc]:匹配除a,b,c以外的任意字符。
-
[a-m]:匹配从a到m的所有字符。
释义
-
/^test/:以test开头的字符串
-
/test$/:表示该模式必须出现在字符串的结尾
重复出现
-
/t?est/:该字符t可出现0次或1次
-
/t+est/:该字符t可出现1次或多次
-
/t*est/:该字符t可出现0次或多次
-
/a{4}/:该字符出现4次
-
/a{4,10}/:包含连续4个至10个a字符的字符串
这些重复操作符可以是贪婪的也可以是非贪婪的,默认为贪婪的:匹配所有字符组合。在操作符后边加一个问号?字符,如a+?,可以让该表达式成为非贪婪的:进行最小限度的匹配。
预定义字符类
预定义术语 | 匹配内容 |
---|---|
\t | 水平制表符 |
\b | 空格 |
\v | 垂直制表符 |
\f | 换页符 |
\r | 回车 |
\n | 换行符 |
. | 匹配除了新行之外的任意字符 |
\d | 匹配任意数字,等价于[0~9] |
\D | 匹配任意非数字,定价与[^0~9] |
\w | 匹配包括下划线的任意单词字符,等价于[A-Za-z0-9_] |
\W | 匹配任意非单词字符,等价于[^A-Za-z0-9_] |
\s | 匹配任何空白字符,包括空格,制表符,换页符等 |
\S | 匹配任意非空白字符 |
\b | 匹配单词边界 |
\B | 匹配非单词边界 |
分组
如果将操作符应用于一组术语,可以像数学表达式一样在改组上使用小括号。例如:/(ab)+/匹配一个或多个连续出现的子字符串“ab”
或操作符
可以用|字符表示或者的关系。例如/(ab)+|(cd)+/匹配出现一次或多次的“ab”或“cd”。
反向引用
这种术语表示法是在反斜杠后面加一个要引用的捕获数量,该数字从1开始,如\1、\2等。
例如:/^([dtn])a\1/匹配任意一个以d,t或者n开头,且后边跟着一个a字符,并且再后边跟着的是和第一个捕获相同字符的字符串。因此\1匹配的字符需要在执行的时候才能确定。
在匹配XML类型的标记元素的时候它很有用,例如/<(\w+)>(.+)</\1>/,可以匹配像“<strong>shtat</strong>”这样的元素。
编译正则表达式
正则表达式的两个重要阶段是编译和执行,编译发生在正则表达式第一次被创建时,而执行发生在我们使用编译过的正则表达式进行字符串匹配的时候。
正则表达式只创建一次,并将其保存在一个变量中供后续使用,这是一个重要的优化过程。
捕获匹配的片段
简单匹配一个字符创是否匹配一个模式显然是我们需要做的第一步,但在很多情况下,确定匹配的内容也是很有用的。
(未完待续)