正则元字符
元字符(Metacharacter)是指在正则表达式中具有特殊意义的专用字符。它们可以用来规定其前导字符(即位于元字符前面的字符或表达式)在目标对象中的出现模式。
在正则表达式中有 . ? * + ( ) [ ] { } \ | ^ $ = 等元字符,用这些元字符可以组成各种各样的正则表达式
元字符
元字符使用示例
//字符串只要包含 abc 中的一个就能匹配
console.log( /[abc]/.test('xyzabc') + ' -> ' + /[abc]/.exec('xyzabc') ); // true -> a
console.log( /[abc]/.test('xyzxyz') + ' -> ' + /[abc]/.exec('xyzxyz') ); // false -> null
//字符串只要有 abc 以外的字符就能匹配
console.log( /[^abc]/.test('abcxyz') + ' -> ' + /[^abc]/.exec('abcxyz') ); // true -> x
console.log( /[^abc]/.test('abcabc') + ' -> ' + /[^abc]/.exec('abcabc') ); // false -> null
//字符串只要包含 a-g 中的一个就能匹配
console.log( /[a-g]/.test('xyzabc') + ' -> ' + /[a-g]/.exec('xyzabc') ); // true -> a
console.log( /[a-g]/.test('xyzxyz') + ' -> ' + /[a-g]/.exec('xyzxyz') ); // false -> null
//字符串只要有 a-g 以外的字符就能匹配
console.log( /[^a-g]/.test('xyzabc') + ' -> ' + /[^a-g]/.exec('xyzabc') ); // true -> x
console.log( /[^a-g]/.test('abcabc') + ' -> ' + /[^a-g]/.exec('abcabc') ); // false -> null
//字符串只要包含 a-g H-N 中的一个就能匹配
console.log( /[a-gH-N]/.test('xyzHbc') + ' -> ' + /[a-gH-N]/.exec('xyzHbc') ); // true -> H
console.log( /[a-gH-N]/.test('xyzxyz') + ' -> ' + /[a-gH-N]/.exec('xyzxyz') ); // false -> null
//字符串只要包含 0-9 中的一个就能匹配
console.log( /[0-9]/.test('xyz123') + ' -> ' + /[0-9]/.exec('xyz123') ); // true -> 1
console.log( /[0-9]/.test('xyzxyz') + ' -> ' + /[0-9]/.exec('xyzxyz') ); // false -> null
//字符串只要包含 0或9 中的一个就能匹配
console.log( /[0|9]/.test('xyz012') + ' -> ' + /[0|9]/.exec('xyz012') ); // true -> 0
console.log( /[0|9]/.test('123xyz') + ' -> ' + /[0|9]/.exec('123xyz') ); // false -> null
//字符串只要包含除换行符之外的任何字符就能匹配
console.log( /./.test('\n\n01') + ' -> ' + /./.exec('\n\n01') ); // true -> 0
console.log( /./.test('\n\n\n') + ' -> ' + /./.exec('\n\n\n') ); // false -> null
//字符串只要包含空白字符就能匹配
console.log( /\s/.test('xyz ') + ' -> ' + /\s/.exec('xyz ') ); // true -> ' '
console.log( /\s/.test('xyz') + ' -> ' + /\s/.exec('xyz') ); // false -> null
//字符串只要包含非空白字符就能匹配
console.log( /\S/.test(' xyz') + ' -> ' + /\S/.exec(' xyz') ); // true -> x
console.log( /\S/.test('\t \n') + ' -> ' + /\S/.exec('\t \n') ); // false -> null
//字符串只要包含数字就能匹配
console.log( /\d/.test('xyz123') + ' -> ' + /\d/.exec('xyz123') ); // true -> 1
console.log( /\d/.test('xyzxyz') + ' -> ' + /\d/.exec('xyzxyz') ); // false -> null
//字符串只要不包含数字就能匹配
console.log( /\D/.test('123xyz') + ' -> ' + /\D/.exec('123xyz') ); // true -> x
console.log( /\D/.test('123123') + ' -> ' + /\D/.exec('123123') ); // false -> null
//字符串只要包含数字或字母就能匹配
console.log( /\w/.test('\nxyz') + ' -> ' + /\w/.exec('\nxyz') ); // true -> x
console.log( /\w/.test('\n \t') + ' -> ' + /\w/.exec('\n \t') ); // false -> null
//字符串只要不包含数字或字母就能匹配
console.log( /\W/.test('\n\txy') + ' -> ' + /\W/.exec('\n\txy') ); // true -> \n
console.log( /\W/.test('xyzxyz') + ' -> ' + /\W/.exec('xyzxyz') ); // false -> null
//字符串包含abc其中c可以出现0-n次
console.log( /abc*/.test('xyzabccc') + ' -> ' + /abc*/.exec('xyzabccc') ); // true -> abccc
console.log( /abc*/.test('xyzabxyz') + ' -> ' + /abc*/.exec('xyzabxyz') ); // true -> ab
console.log( /abc*/.test('xyzaaxyz') + ' -> ' + /abc*/.exec('xyzaaxyz') ); // false -> null
//字符串包含abc其中c至少出现一次
console.log( /abc+/.test('xyzabccc') + ' -> ' + /abc+/.exec('xyzabccc') ); // true -> abccc
console.log( /abc+/.test('xyzabxyz') + ' -> ' + /abc+/.exec('xyzabxyz') ); // false -> null
//字符串包含abc其中c只匹配0-1次
console.log( /abc?/.test('xyzabccc') + ' -> ' + /abc?/.exec('xyzabccc') ); // true -> abc
console.log( /abc?/.test('xyzabxyz') + ' -> ' + /abc?/.exec('xyzabxyz') ); // true -> ab
//范围匹配
console.log( /abc{1}/.test('xyzabccc') + ' -> ' + /abc{1}/.exec('xyzabccc') ); // true -> abc
console.log( /abc{1}/.test('xyzabxyz') + ' -> ' + /abc{1}/.exec('xyzabxyz') ); // false -> null
console.log( /abc{1,}/.test('xyzabccc') + ' -> ' + /abc{1,}/.exec('xyzabccc') ); // true -> abccc
console.log( /abc{1,2}/.test('xyzabccc') + ' -> ' + /abc{1,2}/.exec('xyzabccc') );// true -> abcc
// * + {} 默认情况匹配是贪婪模式(即最多匹配),后面增加 ? 后就使用非贪婪模式匹配(即最少匹配)
console.log( /abc*?/.test('xyzabccc') + ' -> ' + /abc*?/.exec('xyzabccc') ); // true -> ab
console.log( /abc*?/.test('xyzabxyz') + ' -> ' + /abc*?/.exec('xyzabxyz') ); // true -> ab
console.log( /abc+?/.test('xyzabccc') + ' -> ' + /abc+?/.exec('xyzabccc') ); // true -> abc
console.log( /abc{1,}?/.test('xyzabcc') + ' -> ' + /abc{1,}?/.exec('xyzabcc') ); // true -> abc
//字符串必须以abc开头
console.log( /^abc/.test('abcxyz') + ' -> ' + /^abc/.exec('abcxyz') ); // true -> abc
console.log( /^abc/.test('xyzabc') + ' -> ' + /^abc/.exec('xyzabc') ); // false -> null
//字符串必须以abc结尾
console.log( /abc$/.test('xyzabc') + ' -> ' + /abc$/.exec('xyzabc') ); // true -> abc
console.log( /abc$/.test('abcxyz') + ' -> ' + /abc$/.exec('abcxyz') ); // false -> null
//只检查单词边界,不占匹配位置
console.log( /hello\b/.test('hello world') + ' -> ' + /hello\b/.exec('hello world') ); // true -> hello
console.log( /hello\b/.test('helloworld') + ' -> ' + /hello\b/.exec('helloworld') ); // false -> null
console.log( /hello\B/.test('hello world') + ' -> ' + /hello\B/.exec('hello world') ); // false -> null
console.log( /hello\B/.test('helloworld') + ' -> ' + /hello\B/.exec('helloworld') ); // true -> hello
//正则表达式本身默认为组0,每增加一个捕获组,返回结果中也增加一个结果
console.log( /a(bc)/.test('abcxyz') + ' -> ' + /a(bc)/.exec('abcxyz') ); // true -> abc,bc
console.log( /a(?:bc)/.test('abcxyz') + ' -> ' + /a(?:bc)/.exec('abcxyz') ); // true -> abc
//环视断言只做预查,不向前或向后匹配
console.log( /.+/.test('xyzxyz') + ' -> ' + /.+/.exec('xyzxyz') ); // true -> xyzxyz
console.log( /(?=[a-z]+).+/.test('xyzxyz') + ' -> ' + /(?=[a-z]+).+/.exec('xyzxyz') ); // true -> xyzxyz
console.log( /(?![a-z]+).+/.test('xyzxyz') + ' -> ' + /(?![a-z]+).+/.exec('xyzxyz') ); // false -> null
console.log( /.+(?<=[a-z]+)/.test('xyzxyz') + ' -> ' + /.+(?<=[a-z]+)/.exec('xyzxyz') );// true -> xyzxyz
console.log( /.+(?<![a-z]+)/.test('xyzxyz') + ' -> ' + /.+(?<![a-z]+)/.exec('xyzxyz') );// false -> null