正则表达式(Regular Expression)是一种文本模式,普通字符和特殊字符(元字符)。
通过正则表达式可以:
- 测试字符串内的模式。
- 替换文本。
- 基于模式匹配从字符串中提取字符串。
1.正则表达式语法
1.1 非打印字符
\cx
匹配由x指定的字符。\cM—>Control-M或回车符。\f
匹配一个换页符;\n
匹配一个换行符;\r
匹配一个回车符;\s
匹配任何空白字符;\S
匹配任何非空白字符;\t
匹配一个制表符;\v
匹配一个垂直制表符;
1.2 特殊字符
$
匹配输入字符串结尾位置。()
匹配一个子表达式开始和结束位置。*
匹配前面子表达式零次或多次。([0,n],n>=1
)+
匹配前面表达式一次或多次。([1,n],n>1
)?
匹配前面零次或一次。([0,1]
])|
指明两项中选一个。.
匹配除了换行符\n
符号外的单字符。(n=1
)[
中括号表达式开始。\
转义符。^
匹配字符串开始,除非在方括号[]
中使用,表示排除方括号[]
里的内容。{
标记限定符表达式开始。
1.3限定符
指定正则表达式组件必须出现才能满足匹配。
{n}
n是一个非负整数,匹配确定n次。{n,}
,>=n次匹配。{n,m}
,n<=x<=m,匹配x次。
2. 定位符
\b
匹配一个字边界,即word与word间的空格的位置。
/\bCha/ ---->匹配的是Chapter开头三个字母。
/ter\b/ ---->匹配的是Chapter结尾的三个字母
\B
非字边界匹配,word和word之间没有空格。
/\Bapt/ --->1.匹配Chapter,但是不匹配aptitude
3. 元字符
(?:pattern)
匹配pattern但是不获取结果,不进行储存供以后使用。
industr(?:y|ies)相比industry|industries更简单有效
(?=pattern)
正向肯定预查,匹配不需要获取供以后使用
Windows(?=95|98|NT|2000);
这里能匹配Windows 2000中“Windows”,但是不能匹配Windows 3.1中的“Windows”
(?!pattern)
正向否定预查,不匹配pattern字符串开始处匹配查找字符串。
Windows(?!95|98|NT|2000);
这里不能匹配Windows 2000中“Windows”,但是能匹配Windows 3.1中的“Windows”
x|y
匹配x或y;z|food
—>或food
,(z|f)ood
—>zood
或food
。[xyz]
字符集合,匹配任何一个字符集合。[^xyz]
不包含该字符集合[a-z]
字符范围[^a-z]
字符补区间\d
匹配一个数字—>[0-9]\D
匹配一个非数字\w
匹配任何包含下划线的单词–>[A-Za-z0-9_]
\num
对所有获取的匹配的引用。(.)\1
–>两个连续相同字符.
3.1 选择
用圆括号将所有选择项括起来,相邻选项用|分割开来。但是圆括号会有一个副作用,是相关匹配会被缓存。此时用
?:
放在第一个相处这种副作用。
非捕获元
?:
、?=
正向预查,任何开始匹配圆括号内的正则表达式位置匹配搜索字符串。?!
负向预查,任何开始不匹配正则表达式模式位置来匹配搜索字符串。
反向引用
对于一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区,所捕获的每个子匹配都按照正则表达式模式中从左到有出现的顺序储存。缓冲区编号从1开始,最多可存储99个捕获子表达式,用\n
访问,其中n为一个表示特定缓冲区的一位或两个十进制数。
可以使用非捕获元来重写捕获,忽略相关匹配的保存。
//反向引用最简单、最有用应用之一,提供查找文本中两个相同的相邻单词的匹配项能力
//查找重复单词
var str="Is is the cost fo of gasoline going up up";
var patt1=/\b([a-z]+)\1\b/ig;
document.write(str.match(patt1));--->Is is ,of of,up up
1.捕获表达式[a-z]+,一个或多个字母。
2.第二部分是对以前捕获的表达式引用,单词的第二个匹配项正好由括号表达式匹配。`\1`指定第一个匹配项。
3.字边界元字符只检测整个单词
4.`g`全局标记尽可能多的匹配。
5.`i`指定不区分大小写
反向引用开可以将通用资源指示符(URL)分解为其组件。
var str="https://www.baidu.com:80/html/html-tutuorial.html";
var patt1=/(\w+):\/\/([^/:]+)(:\d*)?([^#]*)/;
arr=str.match(patt1);
for(var i=0;i<arr.length;i++){
document.write(arr[i]);
document.write("<br/>");
}
---》
https
www.baidu.com
:80
/html/html-tutorial.html
- 第一个括号表达式捕获Web地址协议部分,该表达匹配冒号和两个斜杠前面的任何单词。
- 第二个括号表达式捕获地址域地址部分,子表达式捕获除/和:所有单词
- 第三个括号子表达式捕获的是端口号,匹配零个或是多个数字,只能出现一次表达式。
- 最后括号子表达式捕获Web地址指定路径/或页信息。该表达式匹配不包括#或空格字符的任何字符序列。
5.运算优先级
从左到右运算并且遵循优先级,由高到低:
\
转义()
、(?:)
、(?=)
、(?!)
,[]
圆括号*
,+
,?
,{n}
,{n,}
,{n,m}
限定符^
,$
,\
任何元字符,任何字符:定位点和序列。|
或操作