欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript正则表达式简明教程(二)

程序员文章站 2024-01-04 20:48:34
...

正则表达式基础语法

匹配单个字符

.用于匹配单个字符:

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>' ]

上一篇:

下一篇: