正则表达式(Regular Expression)是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。(表单的判断)
一、创建
JavaScript通过内置对象RegExp 支持正则表达式,有两种方式创建正则表达式对象,如果我们想匹配字符串中<%xxx%>两个百分号分割的字符串可以这么写
①构造函数
var reg = new RegExp('<%[^%>]+%','g');
②字面量(简写)
var reg= /<%[^%>]%>/g;
修饰符(参数)
g:global
全文搜索,不添加的话搜索到第一个结果停止搜索,所有符合规则的全部匹配出来。
i:ingore case
忽略大小写,默认大小写敏感,大小写都可以匹配到
m:multiple lines
多行搜索
二、元字符
( { [ \ ^ $ | ) ? * + .
并不是每个字符都有特定的意义,在不同组合中元字符有不同的意义。
字符 | 含义 |
---|---|
\t | 水平制表符 |
\r | 回车符 |
\n | 换行符 |
\f | 换页符 |
\cX | 与x对应的控制字符(ctrl+x) |
\v | 垂直制表符 |
\0 | 空字符 |
三、字符类
一般情况下正则表达式一个字符(转义字符算一个)对应一字符串一个字符。
- 范围
var reg = /[a-z0-9A-Z]/ig
中[]
表示获取之内的范围内的值,可以自己设置成任意一段字符串,表示在这个范围内获取值, - 取反
[^···]
表示获取这个范围内没有的值
四、预定义类
正则表达式提供了几个常用的预定义类来匹配常见的字符
字符 | 等价类 | 含义 |
---|---|---|
. | [^\r\n] | 除了回车符和换行符之外的所有字符 |
\d | [0-9] | 数字字符 |
\D | [^0-9] | 非数字字符 |
\s | [\t\n\x0B\f\r] | 空白符(回车、换行、制表、空格) |
\S | [^\t\n\x0B\f\r] | 非空白符 |
\w | [a-zA-Z_0-9] | 单词字符,字母,数字下划线 |
\W | [^a-zA-Z_0-9] | 非单词字符 |
/x0B/
垂直tab
边界
字符 | 含义 |
---|---|
^ | 以xxx开头 |
$ | 以xxx结尾 |
\b | 单词边界 |
\B | 非单词边界 |
注意
▪ ^
不在中括号内,/^hello/g
表示匹配以hello开头的字符串,没有返回null
▪ $
的用法是/hello$/g
在字符串最后
▪ \b
单词边界,/\bhello\b/g
表示前后都要有边界(空格或者中横线、开头或者结尾,还有\t,\n,\r),/\bhello/g
表示只要前面有边界就可以匹配到。
量词
为了匹配连续出现n次的字符串,正则表达式引入了一些量词,
字符 | 含义 |
---|---|
? | 出现零次或一次(最多出现一次) |
+ | 出现一次或多次(至少出现一次) |
* | 出现零次或多次(任意次) |
{n} | 出现n次 |
{n,m} | 出现n-m次 |
{n,} | 至少出现n次 |
量词前的字符串有括号,表示要整个字符串匹配才算匹配,如果没有括号,最后一个字符串也在量词匹配的范围
(url:含http://或者https://或者//都表示标准的url)
只对前一个字符有作用
//判断是否符合url标准:
str.math(/https?:\/\/.+/) //包含http或者https
str.math(/^(https?:)?\/\/.+/) // 包含http、https、//
如何判断用户输入的是不是一个手机号
str1.match(/^1[3578]\d{9}$/g)
//满足条件
贪婪模式
默认尽可能多的匹配
举个栗子:
var str = 'hello everyone "I" am "cjj" xixixi'
str.match(/".*"/)
//.表示除了回车和换行之外的所有字符
//*表示任意次
//结果是"I" am "cjj"
分析:
① 执行"
、.
和*
:因为str整个字符串都满足.
, *
又表示任意次,所以按照顺序,匹配到第一个"
号开始,到最后一个字符i
结束。
②str.match((/".*"/)
执行到第二个"
,发现匹配的最后一个不是"
号,于是开始往回找,找最后一个"
号,因此输出不是分别含有""
的字符串。
非贪婪模式
非贪婪模式和贪婪模式相反,可通过在代表数量的标识符后放置
?
来开启非贪婪模式。 默认尽可能少的 匹配
var str = 'hello everyone "I" am "cjj" xixixi'
str.match(/".*?"/) //"I" "cjj"
其他重点
-
前面的方法都是针对其前一个字符,若要看成一个整体,需要加
()
。 -
若是两个字符串都需要匹配
(frist|second)
,表示或,会把两边看做一个整体 -
前瞻
表达式 | 含义 |
---|---|
exp1(?=exp2) | 匹配后面是exp2的exp1 |
exp1(?!exp2) | 匹配后面不是exp2的exp1 |
正则表达式的方法
- reg.test(str); //true或者false;判断str是否符合reg规则
-
exec(str)
持续运行
var str = '123 456 789'
var reg = /\d{3}/g
while(result = reg.exect(str)){
console.log(result[0]
}
//123
//456
//789
(字符串)
-
.split(reg)
复杂分隔
'a1b2c3d'.split(/\d/);
//["a","b","c","d"] -
.search(reg)
不进行全局匹配,会忽略g
、lastIndex
属性,并且只会从字符串的开始进行检索,返回字符串的第一个匹配位置。
'a1b2c3'.search(/\d/g); //1
'a1b2c3'.search(/\d/); //1
-
.match(reg)
找到一个或多个匹配文本。 -
.replace(reg,replaceStr)
可以吧符合正则的东西做一个替换。
网友评论