正则表达式学习
符号 | 含义 |
---|---|
\ | 转义字符,将带有意义的字符转变成单纯的字符串。如/a*/代表匹配0个或多个a,/a*/ 将’‘匹配0到多个的含义移除,只表示字符串’’,从而可以匹配 a* |
^ | 开始字符,例如,/^A/ 不匹配 ‘abA’,但是匹配 ‘Ab’ 中的‘A’ |
$ | 结束字符,例如,/c$/不匹配 ’abcd‘中的‘c’,但是匹配 ‘abc’中的‘c’ |
* | 匹配前一个表达式 0次到多次。等价于{0,} console.log(‘abbbcd’.match(/b*/).join(’,’)) // 什么也不显示 console.log(‘abbbcd’.match(/ab*/).join(’ ')) // abbb |
+ | 匹配前一个表达式1次或者多次。等价于{1,} console.log(‘abbbbcd’.match(/b+/).join(’,’)) //bbbb console.log(‘abbbbcd’.match(/bb+/).join(’,’)) //bbbb |
? | 匹配前一个表达式0次或者一次,等价于{0,1} 如果 紧跟子啊任何量词、+、?或者{}的后面**,将会使变量变为*非贪婪的的(匹配尽量少的字符) console.log(‘abbbbcd’.match(/ab?/).join(’,’)) //ab console.log(‘angel’.match(/e?le?/).join(’,’)) // el console.log(‘123abc’.match(/\d+/).join(’,’)) // 123 console.log(‘123abc’.match(/\d+?/).join(’,’)) // 1 |
. | (小数点)匹配除换行符之外的任何单个字符 console.log(‘abbbbcd’.match(/.b/).join(’,’)) // ab console.log(‘abbbbcd’.match(/.d/).join(’,’)) // cd console.log(‘a\rbbbbcd’.match(/.b/).join(’,’)) // bb console.log(‘a\nbbbbcd’.match(/.b/).join(’,’)) // bb |
(x) | 匹配’x‘ 并且记住匹配项,括号被称为捕获括号 模式/(foo) (bar) \1 \2/中的 ‘(foo)’ 和 ‘(bar)’ 匹配并记住字符串 “foo bar foo bar” 中前两个单词。模式中的 \1 和 \2 匹配字符串的后两个单词。注意 \1、\2、\n 是用在正则表达式的匹配环节。在正则表达式的替换环节,则要使用像 $1、 2 、 2、 2、n 这样的语法,例如,‘bar foo’.replace( /(…) (…)/, ‘$2 $1’ )。 console.log(‘bar foo’.replace(/(…)(…)/, ‘$2 $1’)) // fo baro console.log(‘bar foo’.replace(/(…)(…)/, ‘$1 $1’)) // bar baro console.log(‘barfoo’.replace(/(…)(…)/, ‘$2 $1’)) // foo bar console.log(‘barfoo’.replace(/(…)(…)/, ‘$1 $1’)) // bar bar console.log(‘foobarfoobar’.match(/(foo)(bar) \1\2/)) // null 这个还没看懂 console.log(‘foobarfoo’.match(/(foo)(bar)/).join(’,’)) // foobar,foo,bar |
(?:x) | 匹配’x’但是不记住匹配项,叫做非捕获括号 console.log(‘foo’.match(/(?:foo){1,2}/).join(’,’)) // foo console.log(‘foofoo’.match(/(?:foo){1,2}/).join(’,’)) // foofoo console.log(‘foofoofoo’.match(/(?:foo){1,2}/).join(’,’)) // foofoo console.log(‘foofoofoo’.match(/foo{1,2}/).join(’,’)) // foo console.log(‘foooofoo’.match(/foo{1,2}/).join(’,’)) // foo0 |
x(?=y) | 匹配‘x’仅仅当‘x’后面跟着‘y’,叫做正向肯定查找 console.log(‘jsong’.match(/jsong(?=neu)/)) // null console.log(‘jsongneu’.match(/jsong(?=neu)/).join(’,’)) // jsong console.log(‘jsongmaster’.match(/jsong(?=neu|master)/).join(’,’)) // jsong console.log(‘jsongneu’.match(/jsong(?=neu|master)/).join(’,’)) // jsong |
x(?!y) | 匹配;x’仅仅当‘x’后面不是’y’时,叫正向否定查找 console.log(‘jsong’.match(/jsong(?!neu)/).join(’,’)) // jsong console.log(‘jsongHAHA’.match(/jsong(?!neu)/).join(’,’)) // jsong console.log(‘jsongss’.match(/jsong(?!neu|master)/).join(’,’)) // jsong console.log(‘jsongneu’.match(/jsong(?!neu|master)/)) // null |
x|y | 匹配x或y console.log(‘jsongneu’.match(/jsong|neu/).join(’,’)) // jsong console.log(‘songneu’.match(/jsong|neu/).join(’,’)) // neu |
{n} | n是一个正数,匹配了前面一个字符刚好发生了n次 console.log(‘ab’.match(/a{2}/)) // null console.log(‘aba’.match(/a{2}/)) // null console.log(‘aab’.match(/a{2}/).join()) // aa console.log(‘aaab’.match(/a{2}/).join()) // aa console.log(‘aabcab’.match(/ab{2}/)) // null console.log(‘aacbb’.match(/ab{2}/)) // null |
{n,m} | n和m都是正数,匹配了前面的字符发生>=n&&<=m次 console.log(‘aaab’.match(/a{2,3}/).join()) // aa console.log(‘aabab’.match(/a{2,3}/).join()) // aa console.log(‘ababab’.match(/a{2,3}/)) // null |
[xyz] | 字符集合,匹配括号中的任意字符,包括转移字符。破折号(-)代表字符范围,如a-c代表abc console.log(‘abc’.match(/[a-r]/).join()) // a console.log(‘abc’.match(/[ab]/).join()) // a console.log(‘a’.match(/[a-c.]/).join()) // a console.log(’.’.match(/[a-c.]/).join()) // . console.log(‘w.’.match(/[\w.]/).join()) // w console.log(’.’.match(/[\w.]/).join()) // . |
[^xyz] | 反向的字符集,就是说 不包括括号中的字符。 console.log(‘abcd’.match(/[^a-c]/).join()) // d console.log(‘a’.match(/[^a-c.]/)) // null console.log(’.’.match(/[^a-c.]/)) // null console.log(‘a.’.match(/[^\c.]/).join()) // a console.log(‘a’.match(/[^w.]/).join()) // a console.log(’.’.match(/[^\w.]/)) // null |
[\b] | 匹配一个退格 console.log(’\b’.match(/[\b]/).join()) // |
\b | 匹配一个词的边界,简单的说\b就是边界,\b的位置不能有字符 console.log(‘moon’.match(/\bm/).join()) // m console.log(‘moon’.match(/oo\b/)) // null console.log(‘moon’.match(/oon\b/).join()) // oon console.log(‘oon’.match(/\boon\b/).join()) // oon |
\B | 匹配非边界 console.log(‘moon’.match(/\Bm/)) // null console.log(‘moon’.match(/oo\B/).join()) // oo console.log(‘possibly yesterday’.match(/yes\B/).join()) // yes |
\cX | 当X是处于A到Z之间的字符的时候,匹配字符串中的一个控制符。 例如,/\cM/ 匹配字符串中的 control-M (U+000D)。这个没弄明白??? |
\d | 匹配一个数字,等价于[0-9] console.log(‘1’.match(/\d/).join()) // 1 console.log(‘23’.match(/\d/).join()) // 2 |
\D | 匹配一个非字符,等价于[^0-9] console.log(‘1’.match(/\D/)) // null console.log(‘2b’.match(/\D/).join()) // b console.log(‘1’.match(/[^0-9]/)) // null console.log(‘2b’.match(/[^0-9]/).join()) // b |
\f | 匹配一个换页符 console.log(’\f’.match(/\f/)) // 空的 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\s | 匹配一个空白符,包括空格,制表符,换页付,换行符 console.log(‘foo bar’.match(/\s\w*/).join()) // bar console.log(’ a’.match(/\sa/).join()) // a |
\S | 匹配一个非空白符 console.log(‘foo bar’.match(/\S\w*/).join()) // foo console.log(‘ba’.match(/\Sa/).join()) // ba |
\t | 匹配一个水平制表符 |
\v | 匹配一个垂直制表符 |
\w | 匹配一个单字字符(字母、数字、下划线),等价于[A-Za-z0-9_] console.log(‘foo bar’.match(/\w/).join()) // f console.log(’_foo bar’.match(/\w/).join()) // _ console.log(‘1foo bar’.match(/\w/).join()) // 1 |
\W | 匹配一个非单字字符串,等价于[^A-Za-z0-9_] console.log(’%foo bar’.match(/\W/).join()) // % console.log(’$foo bar’.match(/\W/).join()) // $ |
\n | 在正则表达式中,它返回最后的第n个子捕获匹配的子字符串(捕获的数目以左括号计数)。 console.log(‘apple, orange, cherry, peach.’.match(/apple(,)\sorange\1/).join(’ ')) // apple, orange, , |
参考
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions