正则
var reg = /is/;
表示单词边界,保证is是完整单词。
'is,is'.replace(reg,'IS')//'IS,is'
// String.prototype.replace(reg,'IS')用第二个参数替换符合第一个正则的字符
g代表全文搜索(global)
'is,is'.replace(/is/g,'IS')//'IS,IS'
i 代表忽略大小写,默认对大小写是敏感的(ignore case)
'is,Is'.replace(/is/gi,'has')//"has,has"
m 代表多行匹配(multiline)
[]字符类
[]代表某类,只要有其中之一就可以了
'is am are'.replace(/[abc]/g,'0')//"is 0m 0re"
^字符类取反
'is am are'.replace(/[abc]/g,'0')//"000a00a00"
范围类[a-z],[0-9],[a-zA-Z]
预定义类
大写代表取反,如D之类
- .除了回车换行以外所有字符
- d [0-9]
- s 空白符
- w [a-zA-Z_0-9]单词字符(数字字母下划线)
边界
单词边界 B非单词边界
^以什么开始 $以什么结束
'1a2a3a'.replace(/d./g,'0')//'000'
'1a2a3a'.replace(/d.$/g,'0')//"1a2a0"
量词
word | times |
---|---|
? | [0,1] |
+ | [1,+infinite) |
* | [0,infinite) |
{n} | n |
{n,m} | [n,m] |
{n,} | [n,+infinite) |
'22a333a4444a'.replace(/d{3}/g,'0')//22a0a04a"
贪婪模式
正则会尽可能多的匹配结果。
非贪婪模式,只要最少匹配成功就可以了。
'12345678'.replace(/d{3,6}?/g,'m')//'mm78'
分组()
'ab123aba11abab1'.replace(/(ab){2}/g,'X');//"ab123aba11X1"
或|
'appabb'.replace(/a(pp|bb)/g,'X')//"XX"
分组换位
'2017-03-14'.replace(/(d{4})-(d{2})-(d{2})/g,'$3/$2/$1')//"14/03/2017"
前瞻
js没有后顾
'z1_3ab'.replace(/w(?=d)/g,'X')//"X1X3ab"
否定前瞻
'z1_3ab'.replace(/w(?!d)/g,'X')//"zX_XXX"
RegExp
属性
global multiline ignore 都是只读的boolean型
lastIndex 当前匹配结果的最后一个字符的下一个字符
source 字面量(不包括g之类)
方法
RegExp.prototype.test(str)
有匹配结果返回true,否则false,这里有个小问题
var reg = /w/g;
reg.test('ab');//true
reg.test('ab');//true
reg.test('ab');//false
reg.test('ab');//true
这是因为对正则匹配全局,每次都会改变reg的lastIndex属性每次+1,在这个例子中的3遍就无法找到了,第四次又重置回0。
exec(str)
非全局
var reg = /d(w)d/;
var str = '#2a3c4d5b';
console.log(reg.exec(str))//Array:['2a3',a] .input='#2a3c4d5b' .index = 1;
//index匹配结果第一个字符的位置
全局
var reg = /d(w)d|(#)/g;
var str = '2a3c4d5b#';
console.log(reg.exec(str))//Array:['2a3',a,undefined] .input='#2a3c4d5b' .index = 0;
console.log(reg.exec(str))//Array:['4d5',d,undefined] .index = 4;
console.log(reg.exec(str))//['#',undefined,'#'] .index = 8 ;
字符串的方法
search
返回下标
'a1b2c3'.search('2')//3
match
'a1b2c3'.match(/d/g)//['1','2','3']