正则
#
字符简写\d ==> 匹配数字
/\d/ === /[0-9]/
\D ==> 除数字外的任意字符
/\D/ === /[^0-9]/
\w ==> 匹配字母数字或下划线
/[A-Za-z0-9_]/
\W ==> 非单词字符
/[^A-Za-z0-9_]/
\s ==> 匹配任意的空白符
/\s/ === /[\r\t\f\n\v]/
\r ==> 匹配一个回车符 \t ==>匹配一个制表符 \f ==>匹配一个换页符 \n ==>匹配一个换行符/
\S ==> 非空白符
/\S/ === /[^\r\t\f\n\v]/
. ==> 匹配任意字符除了换行符、回车符、行分隔符和段分隔符
\b ==> 匹配单词的开始或结束
\B ==> 和上面相反
#
量词{m,}
至少出现m
次{m}
等价于{m,m}
出现m
次?
等价于{0,1}
出现 or 不出现+
等价于{1,}
出现至少一次*
等价于{0,}
出现任意次 有可能不出现
#
匹配位置^ $
开头结尾?
?
之前的可选?=p
该位置后面的字符要匹配 p
"hello".replace(/(?=l)/g, '#'); // => "he#l#lo"
?!p
"hello".replace(/(?!l)/g, '#'); // => "#h#ell#o#"
match() test()
#
//match() & test() 刚好反过来let testStr = 'freeCodeCamp';let testRegex = /Code/;testRegex.test(testStr); //true
let ourStr = 'Regular expressions';let ourRegex = /expressions/;ourStr.match(ourRegex); //["expressions"]
#
元字符/Code/ig
i ==> 忽略大小写
g ==> 全局搜索
m ==> 多行
y ===> 粘滞匹配
#
修饰语/A|B/
==> 多个匹配 匹配|前后任意字符.
通配符 在前面后面都可以好像
let hugStr = 'Bear hug';let huRegex = /hu./;hugStr.match(huRegex);// ["hug", index: 5, input: "Bear hug", groups: undefined]hugStr.match(hug).length; // 1
- 将单个字符与多种可能性匹配
[] ==> 匹配方括号内的任意字符。比如 [0-9] 就可以用来匹配任意数字
let bgRegex = /b[aiu]g/; //匹配bag、big、bug
let bgRegex = /[a-e]at/; //匹配aat、bat、……、eat
let myRegex = /[a-z0-9]/gi;
^ $
匹配字符串的开头 结尾
let firstString = 'Ricky is first and can be found';let firstRegex = /^Ricky/;//let lastRegex = /found$/;firstRegex.test(firstString); // true
- 否定字符集
[^] ==> [^9],这样使用代表不匹配方括号内除了 9 的字符
;/[^aeiou]/gi元匹字所有符配非音
+ ==> 只匹配出现 1 次及以上 + 前的字符
/*匹配出现1次或多次的字符*//a+/g会在"abc"中匹配到一个匹配项,并且返回["a"]。
* ==> 只匹配出现 0 次及以上 * 前的字符
/*匹配出现0次或多次的字符*/let chewieQuote = "Aaaaaaaaaaaaaaaarrrgh!";let chewieRegex = /Aa*/;let result = chewieQuote.match(chewieRegex);console.log(result);//Aaaaaaaaaaaaaaaa
/*用惰性匹配来查找字符*///贪婪 匹配到适合该匹配模式的最大子字符串。/t[a-z]*i/ "titanic" ====> ["titani"]//懒惰/t[a-z]*?i/ "titanic" ====> ["ti"]
{1, 2} ==> 匹配 1 到 2 位字符
/*利用数量说明符匹配上下限*/let A4 = 'haaaah';let A2 = 'haah';let A100 = 'h' + 'a'.repeat(100) + 'h';let multipleA = /ha{3,}h/;//let multipleA = /ha{3,5}h/;//let multipleA = /ha{3}h/;multipleA.test(A4); // Returns truemultipleA.test(A2); // Returns falsemultipleA.test(A100); // Returns true
? ==> ? 之前字符可选
/*利用?来表面字母的不确定部分*/let american = 'color';let british = 'colour';let rainbowRegex = /colou?r/;rainbowRegex.test(american); // Returns truerainbowRegex.test(british); // Returns true
- 先行断言
let quit = 'qu';let noquit = 'qt';let quRegex = /q(?=u)/; //正向let qRegex = /q(?!u)/; //负向quit.match(quRegex); // Returns ["q"]noquit.match(qRegex); // Returns ["q"]
/*捕获组重用模式*///匹配任意两个被空格分割的单词let repeatStr = 'regex regex';let repeatRegex = /(\w+)\s\1/;repeatRegex.test(repeatStr); // Returns truerepeatStr.match(repeatRegex); // Returns ["regex regex", "regex"]
/*捕获组搜索和替换*/let wrongText = 'The sky is silver.';let silverRegex = /silver/;wrongText.replace(silverRegex, 'blue');// Returns "The sky is blue."
'Code Camp'.replace(/(\w+)\s(\w+)/, '$2 $1');// Returns "Camp Code"
// Replace low-upper case to low-space-uppercasestr = str.replace(/([a-z])([A-Z])/g, '$1 $2');
/*删除开头和结尾的空白*/let hello = ' Hello, World! ';let wsRegex = /^\s+|\s+$/g; // 修改这一行let result = hello.replace(wsRegex, ''); // 修改这一行console.log(result);
/*一个案列来理解有+和无*/let quoteSample = 'The five boxing wizards jump quickly.';let alphabetRegexV2 = /[A-Za-z0-9]+/g; // 修改这一行let result = quoteSample.match(alphabetRegexV2);console.log(result);//有+ The,five,boxing,wizards,jump,quickly//无+ T,h,e,f,i,v,e,b,o,x,i,n,g,w,i,z,a,r,d,s,j,u,m,p,q,u,i,c,k,l,y
(yck) ==> 只匹配和 yck 相同字符串