使用单个字符串来描述、匹配一系列符合某个语法规则的字符串,它通常被用来检索、替换那些符合某个模式的文本。比如,登录框,用户输入信息,用它判断输入信息是不是符合格式。JS里有个对象,通过它创建一个规则,对字符串进行匹配,看看字符串是不是匹配规则,匹配上了就是true,否则false。
创建
内置对象RegExp:
var reg=new RegExp('<%[^%>]+%>','g') //构造函数太复杂了
字面量写法:
var reg=/<%[^%>]%>/g
undefined
reg
/<%[^%>]%>/g
有几个修饰符:
//最后的g代表global,全局搜索,不添加只搜到第一个结果停止。
//i:ingore case,忽略大小写,默认大小写敏感
//m:multiple lines,多行搜索
var reg=/hello/gi
undefined
reg
/hello/gi //在控制台展示效果像是字符串形式,其实reg是个复杂对象,展示出来看起来像是字符串。
最根本的是函数写法,符合原意,但是太麻烦,字面量写法就是用符号代替函数的意义,应用上更方便了。构造函数里面格式是字符串,字面量写法里面是正常的写法。
元字符
在正则表达式中有特殊意义的字符,可以规定其前导字符,并不多。
([{\^$|)?*+.
如果想用这些元字符的本来意义,要先转义,用\。
\t //水平制表符
\r //回车符
\n // 换行符
\f //换页符
\cX //与X对应的控制字符
\v //垂直制表符
\0 //空字符
字符类
var reg=/ab\t/
正则表达式只是匹配字符串,作用就太小了,它能匹配类,某一类有共同规则的。
范围
var reg=/[a-z]/ig
var reg=/[0-9]/ig
var reg=/[abc012]/ig
//[]出现,代表一个字符的挑选,只能代表一个字符的占位哦。
取反
var reg=/[^abc012]/ig
//只要不是abc012它们中的任何一个,就会被选中。
区间
[a-z]
var reg=/[0-9a-zA-Z]/ig
一定意义的匹配
. === [^\r\n]除回车换行外的所有字符
\d === [0-9]数字字符
\D === [^0-9]非数字字符
\s === [\t\n\x0B\f\r]空白符:回车换行制表空格就可以了,\x0B是垂直制表符
\S === [^\t\x0B\f\r\n]非空白符
\w === [a=zA=Z0-9]单词字母数字下划线
\W === [^a-zA-Z_0-9]非单词字母数字下划线
var str ='hello world 123456 \t \r jirengu \n ruoyu'
undefined
str
"hello world 123456
jirengu
ruoyu"
看图运行比较好:\t制表嘛,就是我选中的长的蓝色部分,再看空格\r短的蓝色部分
\n换行嘛。
str
"hello world 123456
jirengu
ruoyu"
str.search('world')
6
str.match('world')
["world", index: 6, input: "hello world 123456
jirengu ↵ ruoyu"]
str.match(/\d/)
["1", index: 12, input: "hello world 123456
jirengu ↵ ruoyu"]
str.match(/\d/g)
(6) ["1", "2", "3", "4", "5", "6"]0: "1"1: "2"2: "3"3: "4"4: "5"5: "6"length: 6__proto__: Array(0)
str.match(/\w/g)
(28) ["h", "e", "l", "l", "o", "w", "o", "r", "l", "d", "1", "2", "3", "4", "5", "6", "j", "i", "r", "e", "n", "g", "u", "r", "u", "o", "y", "u"]
str.match(/\W/g)
(10) [" ", " ", " ", " ", " ", "
", " ", " ", "↵", " "]0: " "1: " "2: " "3: " "4: " "5: "
"6: " "7: " "8: "↵"9: " "length: 10__proto__: Array(0)
str.match(/./g)
(36) ["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d", " ", "1", "2", "3", "4", "5", "6", " ", " ", " ", " ", "j", "i", "r", "e", "n", "g", "u", " ", " ", "r", "u", "o", "y", "u"]
str.match(/ /g)
(7) [" ", " ", " ", " ", " ", " ", " "]
边界
^ 以XXXX开头
$ 以XXXX结尾
\b 单词边界
\B 非单词边界
str
"hello world 123456
jirengu
ruoyu"
str.match(/[^hello]/g) //有[]匹配的是一个字符
(29) [" ", "w", "r", "d", " ", "1", "2", "3", "4", "5", "6", " ", " ", " ", "
", " ", "j", "i", "r", "n", "g", "u", " ", "↵", " ", "r", "u", "y", "u"]
str.match(/^hello/g) //没有[]匹配的是以什么什么开头的
["hello"]0: "hello"length: 1__proto__: Array(0)
str
"hello world 123456
jirengu
ruoyu"
str.match(/hello$/g)
null
var str ='hello world 123456 \t \r jirengu \n ruoyu hello'
undefined
str.match(/hello$/g)
["hello"]0: "hello"length: 1__proto__: Array(0)
var str ='hello1 world hello2 123456 \t \r jirengu \n ruoyu hello3'
undefined
str.match(/hello\d/g)
(3) ["hello1", "hello2", "hello3"]0: "hello1"1: "hello2"2: "hello3"length: 3__proto__: Array(0)
str.match(/hello\d$/g)
["hello3"]
str.match(/^hello/g)
["hello"]0: "hello"length: 1__proto__: Array(0)
str.match(/^hello1/g)
["hello1"]
str.match(/^hello\d/g)
["hello1"]
var str ='hello1 whello9orld hello2 12-hello8-3456 \t \r jirengu \n ruoyu hello3'
undefined
str.match(/\bhello\d\b/g)
(4) ["hello1", "hello2", "hello8", "hello3"]0: "hello1"1: "hello2"2: "hello8"3: "hello3"length: 4__proto__: Array(0)
var str ='hello1 hello9orld hello2 12-hello8-3456 \t \r jirengu \n ruoyu hello3'
undefined
str.match(/\bhello\d/g)
(5) ["hello1", "hello9", "hello2", "hello8", "hello3"]
str.match(/hello\d\b/g)
(4) ["hello1", "hello2", "hello8", "hello3"]
//单词边界可以是空格,可以是特殊字符-,不可以是数字和字母
//单词边界有哪些特殊字符,除了-,\t \r \n呢?
var str ='\thello1 hello9orld hello2 12-hello8-3456 \t \r jirengu \n ruoyu hello3'
undefined
str.match(/\bhello\d\b/g)
(4) ["hello1", "hello2", "hello8", "hello3"]
var str ='\rhello1 hello9orld hello2 12-hello8-3456 \t \r jirengu \n ruoyu hello3'
undefined
str.match(/\bhello\d\b/g)
(4) ["hello1", "hello2", "hello8", "hello3"]
var str ='\nhello1 hello9orld hello2 12-hello8-3456 \t \r jirengu \n ruoyu hello3'
undefined
str.match(/\bhello\d\b/g)
(4) ["hello1", "hello2", "hello8", "hello3"]
小测试:
var str = 'header clearfix active header-fix'
undefined
//找单词header
str.match(/(^|\s)header($|\s)/g)
["header "]
量词
? 出现0次或1次
+ 至少出现1次
* 出不出现都可以
{n} 出n次
{n,m} 出现n到m次
{n,} 至少出现n次
var str='http://jirengu.com'
undefined
var str2='https://jirengu.com'
undefined
str.match(/https?:\/\/.+/)
["http://jirengu.com", index: 0, input: "http://jirengu.com"]
str2.match(/https?:\/\/.+/)
["https://jirengu.com", index: 0, input: "https://jirengu.com"]
var str3='httpsssss://sandan.com'
undefined
str3.match(/https+:\/\/.+/)
["httpsssss://sandan.com", index: 0, input: "httpsssss://sandan.com"]
str.match(/(https?)?:\/\/.+/)
(2) ["http://jirengu.com", "http", index: 0, input: "http://jirengu.com"]0: "http://jirengu.com"1: "http"index: 0input: "http://jirengu.com"length: 2__proto__: Array(0)
var str4='://nsannan.snf'
undefined //这里的写错了应该没冒号的,不过方法是方法,道理一样的
str4.match(/(https?)?:\/\/.+/)
(2) ["://nsannan.snf", undefined, index: 0, input: "://nsannan.snf"]
str2.match(/(https?)?:\/\/.+/)
(2) ["https://jirengu.com", "https", index: 0, input: "https://jirengu.com"]
如何判断字符串是网址?严谨写法如此:
str.match(/(https?:)?\/\/.+/)
(2) ["http://jirengu.com", "http:", index: 0, input: "http://jirengu.com"]
如何判断电话号码:1开头,共十一位数字,结尾。
var str='19281712837'
undefined
str.match(/^1[3578]\d{9}/)
null
var str2='18825256114'
undefined
str2.match(/^1[3578]\d{9}/)
["18825256114", index: 0, input: "18825256114"]
var str3='aa135666666'
undefined
var str3='aa13566666687'
undefined
str3.match(/^1[3578]\d{9}/)
null
var str4='188252561142382'
undefined
str4.match(/^1[3578]\d{9}/)
["18825256114", index: 0, input: "188252561142382"]
str4.match(/^1[3578]\d{9}$/)
null
str2.match(/^1[3578]\d{9}$/)
["18825256114", index: 0, input: "18825256114"]