正则表达式基础语法
匹配单个字符
.
用于匹配单个字符:
var singleChar = /.t/;
console.log( singleChar.exec("pattern")); // [ 'at', index: 1, input: 'pattern' ]
匹配.
本身:
var dot = /\.t/;
console.log(dot.exec( "at.t")); // [ '.t', index: 2, input: 'at.t' ]
匹配多个字符中的一个
[]
用于表示字符集合:
var section = /[abc]t/;
console.log( section.exec("ztbt") ); // [ 'bt', index: 2, input: 'ztbt' ]
字符集合中-
表示字符区间:
var lowerCase = /[a-z]/;
console.log( lowerCase.exec( "ABCz"));
// [ 'z', index: 3, input: 'ABCz' ]
字符集合^
表示对对字符集合取非:
var noLowerCase = /[^a-z]/;
console.log( noLowerCase.exec( "abc9"));
// [ '9', index: 3, input: 'abc9' ]
特殊字符
对元字符进行转义
元字符包括:
() [] {} . | ^ $ ? * +
var meta = /\[/;
console.log( meta.exec( "abz[a-z]"));
// [ '[', index: 3, input: 'abz[a-z]' ]
元字符出现在字符集合中时可以不转义:
var meta = /[_^.]/;
console.log( meta.exec( "tt.at.t"));
// [ '.', index: 2, input: 'tt.at.t' ]
空白符
-
\n
: 换行符 -
\r
: 回车符 -
\t
: tab -
\v
: 垂直制表符 -
\f
: 换页符
字符类别
-
\d
:[0-9]
-
\D
:[^0-9]
-
\w
:[a-zA-Z0-9_]
-
\W
:[^a-zA-Z0-9_]
-
\s
:[\f\n\r\t\v]
-
\S
:[\f\n\r\t\v]
匹配不确定数目的多个字符
+
表示匹配一个或多个:
var plus = /\d+/;
console.log( plus.exec( "a123b"));
//[ '123', index: 1, input: 'a123b' ]
*
表示匹配零个或多个:
var asterisk = /\w*/;
console.log( asterisk.exec("a123_&&"));
// [ 'a123_', index: 0, input: 'a123_&&' ]
?
表示匹配零个或一个:
var quest = /\w?/;
console.log( quest.exec( "a13_"));
// [ 'a', index: 0, input: 'a13_' ]
匹配确定数目的多个字符
{n}
指定重复次数
var interval = /a{3}/;
console.log( interval.exec( "aaaa" ));
// [ 'aaa', index: 0, input: 'aaaa' ]
{n, m}
重复次数区间
var interval = /a{1,3}/;
console.log( interval.exec( "aa"));
// [ 'aa', index: 0, input: 'aa' ]
{n, }
最少重复次数
var leastInterval = /a{2,}/;
console.log( leastInterval.exec( "abaaa"))
// [ 'aaa', index: 2, input: 'abaaa' ]
贪婪匹配和懒惰匹配
- 贪婪匹配是指
+
*
{n, }
的匹配次数是没有上限的,会匹配尽可能多的字符; - 懒惰匹配是指
+?
*?
{n, }?
会匹配尽可能少的字符;
var lazyLeastInterval = /a{2,}?/;
console.log( lazyLeastInterval.exec("abaaa"));
// [ 'aa', index: 2, input: 'abaaa' ]
//与上例进行比较
位置匹配
边界限定符匹配的是位置,而不是特定字符
\b
:单词边界
-
\b
匹配\w
和\W
之间的位置:
var boundary = /\bcat\b/;
console.log( boundary.exec( "littlecatty and cat"));
// [ 'cat', index: 16, input: 'littlecatty and cat' ]
\B
:非单词边界
-
\B
匹配\w
和\w
,或\W
和\W
之间的位置;
var Boundary = /\Bcat\B/;
console.log( Boundary.exec( "cat and littlecatty"));
// [ 'cat', index: 14, input: 'cat and littlecatty' ]
字符串边界
^
字符串开始
var head = /^cat/;
console.log( head.exec("category"));
// [ 'cat', index: 0, input: 'category' ]
$
字符串结尾
var tail = /cat$/;
console.log( tail.exec("littlecat"));
// [ 'cat', index: 6, input: 'littlecat' ]
回溯引用
子表达式
()
表示子表达式:
var year = /(19|20)\d{2}/;
console.log( year.exec( "1984" ));
// [ '1984', '19', index: 0, input: '1984' ]
不使用子表达式:
var yearFault = /19|20\d{2}/;
console.log( yearFault.exec( "1984"));
// [ '19', index: 0, input: '1984' ]
回溯引用
通过 \number
引用前面的子表达式匹配的结果;
子表达式从 \1
开始计数,\0
表示整个正则表达式;
如果没有回溯引用:
// 匹配标题
var headingFault = /<[hH][1-6].*?<\/[hH][1-6]>/;
var text = "<h5>heading</h3>";
console.log( headingFault.exec( text ));
// [ '<h5>heading</h3>', index: 0, input: '<h5>heading</h3>' ]
这不是我们想要的结果,使用回溯引用:
//错误的标题不能匹配
var heading = /<[hH]([1-6]).*?<\/[hH]\1/;
console.log( heading.exec( text )); //null
//只能匹配正确的标题
var html = "<h1>heading1</h1>";
console.log( heading.exec( html ));
// [ '<h1>heading1</h1', '1', index: 0, input: '<h1>heading1</h1>' ]