为何要用正则
正则表达式是为了专门解决文本的两个问题而产生的:
查找特定的文本(搜索)
查找并编辑特定的文本(替换)
JavaScript中的正则
JavaScript中的正则表达式用RegExp对象来表示。
创建方式:
1. var pattern = new RegExp("s$"); //用RegExp()构造函数来创建
2. var pattern = /s$/; //直接量语法来创建
正则的语法
直接量字符
一般来讲,正则表达式中的所有字母和数字都是按照字面含义进行匹配的。eg:/s/就是匹配字母s。
非一般的话,就是那些转义字符和正则中自带的一些特殊含义的符号。如果想在正则表达式中使用这些字符的直接量进行匹配,则必须使用前缀.
转义字符:\n \r \t \o \v \f \xnn \uxxxx \cX
殊含义的符号: ^ $ . * + ? = ! : | \ / () [ ] { }
字符类
用方括号包裹直接量字符就组成了字符类。
/[abc]/ //匹配字母"a","b","c"中的任意一个
注意:字符类能够匹配包含在中括号中的一系列字符中的任意一个,但是匹配的结果只能够是其中的一个而不是多个。
var str="abcd";
var reg=/[abcd]/;
console.log(str.match(reg));
//结果是 ["a", index: 0, input: "abcd"]
使用连字符"-"
字符类使用连字符目的是用来表示字符范围。
/[a-z]/ //匹配小写字母
/[a-zA-Z0-9]/ //匹配任何字母和数字
注意:字符类可以使用连字符"-"来确定一个匹配的范围,当然使用连字符也是有原则的,前后两个字符是有顺序的,如果使用相同的编码,后面的字符码位应大于或等于前面字符的码位,例如:
[0-9]//正确的
[9-0]//错误的
排除型字符类"^"
[^]是一个排除型字符类,用以匹配不在中括号中的任一字符,当然匹配结果也只能够是一个字符.
/[^abc]/ //匹配除了字符"a"、"b"、"c"之外的任意字符
重复
解决正则表达式中某元素的“重复出现次数”。
重复字符语法:
{n,m} 匹配前一项至少n次,但不能超过m次
{n,} 匹配前一项n次或者更多次
{n} 匹配前一项n次
? 匹配前一项0次或者1次,也就是说前一项是可选的,等价于{0,1}
+ 匹配前一项1次或者多次,等价于{1,}
* 匹配前一项0次或者多次,等价于{0,}
贪婪重复 vs 非贪婪重复
贪婪重复: 尽可能多的匹配
非贪婪重复: 尽可能少的匹配
? ??
+ +?
* +?
注意:使用非贪婪的匹配模式所得的结果可能和期望并不一致。试一试下面例子想想为什么:
var str = 'aaab';
var reg = /a+?b/;
console.log(str.match(reg));
选择、分组和引用
字符”|”
字符”|”用于分隔供选择的字符 ,其实就是或的意思。例如/ab|cd|ef/ 匹配的是“ab”或“cd”或“ef”。
注意:选择项的尝试匹配顺序是从左到右考虑,直到发现了匹配项。如果左边的选择项匹配,则忽略右边的匹配项,即使它产生更好的匹配。
分组
我们可以通过使用圆括号"()"来对正则表达式进行分组 。也就是说把括号内的当成一个独立的单元。构成正则表达式中的子表达式。
引用
引用:我们用引用的对象是谁?
这里就要说下,圆括号"()"在正则表达式中另一个作用是在完整的模式中定义子模式 。
例如:我想要检索的条件是3个字母加上4个数字
var pattern = /[a-z]{3}\d{4}/ ; //3个字母加4个数字的匹配模式
但假定我们真正关心的是每个匹配尾部的数字?要怎么引用数字?so,圆括号"()"派上用场了。
var pattern = /[a-z]{3}(\d{4})/ ; //3个字母加4个数字的匹配模式
带圆括号的表达式的另一个用途是允许我们在同一正则表达式的后部引用前面的子表达式。这是通过在字符””后加一位或多位数字实现的。例如,1引用的是第一个带括号的子表达式,3则表示引用的是第三个带括号的子表达式。
问:如果圆括号"()"中嵌套圆括号"()",那么圆括号"()"的位置怎么计算?
答:以圆括号"()"的左括号位置来算。
var pattern = /([Jj]ava([Sscript)?)\sis\s(fun\w*)/ ; //([Ss]cript)就被指定为/2
接下来再来看看一个例子:
var pattern = /["'][^"']*["']/ ; //匹配的是单引号或双引号之内的0个或多个字符
如果我想要前后引号是匹配的(都是单引号或都是双引号)呢?(这时候就要想起引用了)
var pattern = /(["'])[^"']*\1/ ;
正则表达式的选择、分组和引用字符
| 选择。匹配的是该符号左边的子表达式或右边的子表达式,其实就是布尔“或”
(…) 组合。将几个项目组合为一个单元,这个单元可由*、+、?和|等符号使用,而且 还可以记住和这个组合匹配的字符以供此后的引用使用
(?:…) 只是分组。把项目组合到一个单元,但是不记忆与该组匹配的字符
\n 和第n个分组第一次匹配的字符相匹配。组是括号 中的子表达式(可嵌套,以左半括号开始数,从1开始数,一到数下去 ),以(?:…)分组的组不进行编码
指定匹配位置
正则表达式中的有些元素不匹配某个可见的字符,它们指定匹配发生的合法位置,我们称这些元素为正则表达式的锚,它们将模式定位在搜索字符串的特定位置上。
^ 匹配字符串的开头,在多行检索中,匹配一行的开头
$ 匹配字符串的结尾,在多行检索中,匹配一行的结尾
\b 匹配一个单词的边界,简言之,就是位于字符\w和\W之间的位置,或位于字符\W和字符串开头或结尾之间的位置(但需要注意,[\b]匹配的是退格符)
\B 匹配非单词边界的位置
(?=p) 零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符
(?!p) 零宽负向先行断言,要求接下来的字符不与p匹配
修饰符
修饰符用以说明高级匹配模式的规则,放在"/"符号之外。
i 执行不区分大小写的匹配
g 执行一个全局匹配,简言之,即找到所有的匹配,而不是在找到第一个之后就停止
m 多行匹配模式,^匹配一行的开头和字符串的开头,$匹配行的结束和字符串的结束
例子:
var str="This is an\n antzone good";
var reg=/an$/;
console.log(str.match(reg));
//以上代码不能够匹配字符串"an",尽管"an"后面已经换行了,但是并没有采用多行匹配,所以不是字符串行的结尾。
var str="This is an\n antzone good";
var reg=/an$/m;
console.log(str.match(reg));
//以上代码可以匹配字符串"an",因为采用了多行匹配。
总结:
本文简单的介绍了javascript正则表达式的一些基础知识,总结知识点就是用[],{},(),正则的特殊字符,锚,还有修饰符等等,来组成一个一个复杂的正则表达式。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。