什么是正则表达式
可以通过创建RegExp对象,或者表达式直接量来声明
正则表达式模式规则,是由一个字符序列组成。
正则表达式中有特殊含义的标点
^ $ . * + ? = ! : | \ / ( ) [ ] { }
正则表达式字符类
字符 | 匹配 |
---|---|
[...] | 方括号内任意字符 |
[^...] | 不在方括号内的任意字符 |
. | 除了换行符和其他Unicode行终止符之外的任意字符 |
\w | 任意ASCII字符组成的单词,等价于[a-zA-Z0-9] |
\W | 任意不是ASCII字符组成的单词,等价于[^a-zA-Z0-9] |
\s | 任何Unicode空白符 |
\S | 任何非Unicode空白符的字符,\w和\S不同 |
\d | 任何ASCII数字,等价于[0-9] |
\D | 除了ASCII数字之外的任何字符,等价于[^0-9] |
[\b] | 退格直接量 |
正则表达式重复字符语法
字符 | 含义 |
---|---|
{n,m} | 匹配前一项至少n次,但不能超过m次 |
{n,} | 匹配前一项n次或者更多次 |
{n} | 匹配前一项n次 |
? | 匹配前一项0次或者1次,前一项可选,等价于{0,1} |
+ | 匹配前一项1次或者更多次,等价于{1,} |
* | 匹配前一项0次或者多次,等价于{0,} |
let reg1 = /\d{2,4}/ //匹配2-4个数字let reg2 = /\w{3}\d?/ //匹配 三个单词和一个可选的数字let reg3 = /\s+java\s+/ //匹配 前后带有1个或多个空格 的 java 字符串let reg4 = /[^(]*/ //匹配一个或多个非左括号的字符复制代码
选择,分组,引用
正则表达式语法还包括指定选择项,子表达式分组和引用前一子表达式特殊字符。
字符“|”用于分隔供选择的字符
let reg1 = /ab|cd|ef/ //可以匹配 ab ,也可以匹配 cd 还可以匹配 eflet reg2 = /\d{3}|[a-z]{4}/ //匹配的是 三位数字 或者 四个连续字母复制代码
选择项尝试匹配的顺序是从左到右,直到发现匹配项。如果左边发现匹配项,则放弃右边。如
/a|ab/
在匹配 “ab”时,自能匹配 第一个字符。
圆括号有多种作用
- 一个作用是将 单独的项组合成子表达式,以便可以像处理一个独立单元那样,用“|”,“*”,“+”,“?”等对单元内进行处理。
let reg1 = /java(script)?/ //可以匹配java 后边有没有 script 都可以let reg2 = /(ab|cs)+|ef/ //可以匹配 ef ,也可以匹配 ab 或者 cd 的一次或者多次复制代码
- 另一个作用是,完整模式中定义子模式。当一个正则表达式成功和目标字符串匹配,可以从目标串中抽出和圆括号子模式相匹配的部分。
假设,我们真正关心的每个匹配尾部的数字,我们可以将模式数字,放在括号中
let reg1 = /[a-z]+\d+/let reg2 = /[a-z]+(\d+)/复制代码
- 允许在他同意正则表达式的后部引用前面的子表达式 ,通过 ‘\’后面加 一位或多位数字来实现的。这个数字指定带圆括号的子表达式在正则表达式中的位置。
\1 第一个带圆括号的子表达式 \3 第三个带圆括号的子表达式
一个子表达式可以嵌套子表达式,所以位置是参与计数的左括号的位置
// 嵌套的子表达式 ([Ss]cript) 可以用 \2// 第二个左括号let reg1 = /([Jj]ava([Ss]cript)?)\sis\s(fun\w*)/let reg2 = /['"][^'"]*['"]/let reg3 = /['"][^'"]*\1/复制代码
正则表达式 以 “(?:” 和 ”)“进行分组,但这个子表达式只是分组,不能生成引用
/([jJ]ava(?:[Ss]cript)?)\sis\s(fun\W*)/// \2 引用的就是(fun\W*)复制代码
指定匹配位置
正则表达式中的锚字符
字符 | 含义 |
---|---|
^ | 匹配字符串的开头,多行检索中,匹配一行的开头 |
$ | 匹配字符串的结尾,多行检索中,匹配一行的结尾 |
\b | 匹配一个单词的边界,就是 位于 \w 和 \W之间的位置,或位于字符 \w 和字符串的开头或结尾之间的位置 |
\B | 匹配非单词边界的位置 |
// 我们要匹配前后都有空格的 java 字符/\bJava\b///单词边界/\B[Ss]cript/ //这个可以匹配 JavaScript postscript 但是不匹配 script 和 Scripting复制代码
修饰符
字符 | 含义 |
---|---|
i | 执行不区分大小写的匹配 |
g | 执行一个全局匹配,就是要找到所有的匹配 |
m | 多行匹配模式 ^匹配一行的开头和字符串的开头,$ 匹配行的结束和字符串的结束 |
用于模式匹配的String方法
这里是String对象一些用以执行正则表达式的模式匹配 或者 检索替换的操作方法。
search()
参数是一个正则表达式,返回第一个匹配子串的起始位置,如果找不到,则返回 -1
"Javascript".search(/script/i);//4复制代码
search 不支持 全局搜索,会忽略参数 g
replace()
执行检索和替换。 第一个参数是 一个正则表达式,第二个参数是要进行替换的字符串。 若正则表达式设置了g,原字符串中所有匹配子串将替换成第二个参数指定的字符串。
若replace第一个参数是字符串,不是正则表达式,replace直接搜索这个字符串,并不会将其通过RegExp对象转化为正则表达式。
text.replace(/javascript/gi,'JavaSscipt')复制代码
前文,写了模板字符串的编译方法,出现了 replace $+数字
// 一段引用文起始于引号,结束于引号// 中间的内容区域不能包含引号var quote = /"([^"]*)"/g//用中文半角引号,替换英文引号,同时保留引号之间内容(存储在 $1 中)未被修改tetx.replace(quote,'”$1“')复制代码
match()
唯一参数就是正则表达式(或通过RegExp 对象将其转化为正则表达式),返回时一个由匹配结果组成的数组,如果加了 g ,则返回字符串中所有的匹配结果。
"1 plus 2 equals 3".match(/\d+/g) //["1","2","3"]复制代码
再来看一个例子
var url = /(\w+):\/\/([\w.]+)\/(\S*)/var text = "Welcome to visit my blog at http://www.xxxx.com/legendaryedu"var result = text.match(url)if(result != null){ var fullurl = result[0] var protocol = result[1] var host = result[2] var path = result[3]}复制代码
RegExp对象
两个参数:第一个是正则表达式的直接量,第二个是正则表达式修饰符(可选),只能输入 g i m 或他们的组合
RegExp对象方法
最主要方法是 exex()
对一个指定字符串,执行正则表达式,如果没有任何匹配,返回 null ,匹配到 则 返回数组。
这个数组第一个元素包含的是与正则表达式相匹配的字符串,余下的元素是与圆括号内子表达式相匹配的子串。
var str = "Javascript Java"; var patt = new RegExp("(Ja)?va","g");var result;while ((result = patt.exec(str)) != null) { document.write(result); document.write(""); document.write(patt.lastIndex); } //15 Java,Ja// 4 Java,Ja// 15复制代码
test()方法,参数是一个字符串,如果包含正则表达式的一个匹配结果,那么返回true
var pattern = /Java/ipattern.test("JavaScript")复制代码